▶ SecurityConfig 클래스
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
private final TokenProvider tokenProvider;
private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
private final JwtAccessDeniedHandler jwtAccessDeniedHandler;
...
}
- @Configuration: Spring에 이 클래스가 애플리케이션의 설정을 정의하는 클래스임을 알린다. Spring 컨테이너가 이 클래스를 스캔하여 Bean을 생성한다.
- @EnableWebSecurity: Spring Security를 활성화한다. 이 어노테이션이 있으면 Spring은 보안 관련 설정을 사용할 수 있게 된다.
- @RequiredArgsConstructor: Lombok의 어노테이션으로, final 필드를 포함하는 생성자를 자동으로 생성한다. 이를 통해 TokenProvider, JwtAuthenticationEntryPoint, JwtAccessDeniedHandler를 생성자 주입 방식으로 사용할 수 있다.
- private final TokenProvider tokenProvider;: JWT를 생성하고 검증하는 기능을 제공하는 TokenProvider 객체다.
- private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;: 인증 실패 시 처리하는 핸들러다. 인증이 필요한 리소스에 대한 접근이 거부될 때 호출된다.
- private final JwtAccessDeniedHandler jwtAccessDeniedHandler;: 인증된 사용자지만 권한이 없는 경우에 대한 핸들러다. 접근이 거부될 때 호출된다.
▶ passwordEncoder 메소드
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
- @Bean: 이 메소드가 반환하는 객체를 Spring의 Application Context에 등록된 Bean으로 만들어준다.
- public PasswordEncoder passwordEncoder(): 비밀번호를 안전하게 해시하기 위한 PasswordEncoder Bean을 정의한다. BCryptPasswordEncoder를 사용하여 비밀번호를 해싱한다.
▶ filterChain 메소드
더보기
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.cors(cors -> cors.disable());
http.csrf(csrf -> csrf.disable());
http.headers(headers -> headers.frameOptions().disable());
http.exceptionHandling(
e -> e.authenticationEntryPoint(jwtAuthenticationEntryPoint)
.accessDeniedHandler(jwtAccessDeniedHandler));
http.sessionManagement(sessionManagement -> sessionManagement.
sessionCreationPolicy(SessionCreationPolicy.STATELESS));
http.authorizeHttpRequests(
c -> c.requestMatchers(new AntPathRequestMatcher("/api/login")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/api/refresh-token")).authenticated()
.requestMatchers(new AntPathRequestMatcher("/api/signup")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/favicon.ico")).permitAll()
.anyRequest().authenticated());
http.apply(new JwtSecurityConfig(tokenProvider));
return http.build();
}
▷ filterChain 메소드 해석
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
- @Bean: 이 메소드가 반환하는 객체를 Spring의 Application Context에 등록된 Bean으로 만들어준다.
- public SecurityFilterChain filterChain(HttpSecurity http) throws Exception: HttpSecurity 객체를 사용하여 보안 필터 체인을 구성하는 메소드다. 필터 체인은 HTTP 요청에 대한 보안을 설정한다.
http.cors(cors -> cors.disable());
http.csrf(csrf -> csrf.disable());
- http.cors(cors -> cors.disable());: CORS(Cross-Origin Resource Sharing)를 비활성화한다. 이는 API가 다른 출처에서 요청을 받을 수 있도록 설정할 수 있는 기능이다.
- http.csrf(csrf -> csrf.disable());: CSRF(Cross-Site Request Forgery) 공격 방지를 위한 보호 기능을 비활성화한다. 이는 API 서버와 클라이언트가 같은 출처일 때 주로 사용된다.
http.headers(headers -> headers.frameOptions().disable());
- http.headers(headers -> headers.frameOptions().disable());: X-Frame-Options 헤더를 비활성화한다. 이는 클릭재킹 공격을 방지하는 데 사용되는 헤더다.
http.exceptionHandling(
e -> e.authenticationEntryPoint(jwtAuthenticationEntryPoint)
.accessDeniedHandler(jwtAccessDeniedHandler));
- http.exceptionHandling(...): 인증 및 접근 거부에 대한 예외 처리를 설정한다.
- e.authenticationEntryPoint(jwtAuthenticationEntryPoint): 인증이 필요한 리소스에 접근할 때 호출되는 핸들러로 jwtAuthenticationEntryPoint를 설정한다.
- e.accessDeniedHandler(jwtAccessDeniedHandler): 인증된 사용자지만 권한이 없는 경우 호출되는 핸들러로 jwtAccessDeniedHandler를 설정한다.
http.sessionManagement(
sessionManagement -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
- http.sessionManagement(...): 세션 관리를 설정한다.
- sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS): 세션을 사용하지 않는 무상태(stateless) 세션 관리 정책을 설정한다. 각 요청이 독립적이며 세션 정보를 유지하지 않는다.
http.authorizeHttpRequests(
c -> c.requestMatchers(new AntPathRequestMatcher("/api/login")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/api/refresh-token")).authenticated()
.requestMatchers(new AntPathRequestMatcher("/api/signup")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/favicon.ico")).permitAll()
.anyRequest().authenticated());
- http.authorizeHttpRequests(...): HTTP 요청에 대한 인가 규칙을 설정한다.
- requestMatchers(new AntPathRequestMatcher("/api/login")).permitAll(): /api/login 경로는 인증 없이 접근할 수 있도록 허용한다.
- requestMatchers(new AntPathRequestMatcher("/api/refresh-token")).authenticated(): /api/refresh-token 경로는 인증된 사용자만 접근할 수 있도록 설정한다.
- requestMatchers(new AntPathRequestMatcher("/api/signup")).permitAll(): /api/signup 경로는 인증 없이 접근할 수 있도록 허용한다.
- requestMatchers(new AntPathRequestMatcher("/favicon.ico")).permitAll(): /favicon.ico 경로는 인증 없이 접근할 수 있도록 허용한다.
- .anyRequest().authenticated(): 나머지 모든 요청은 인증을 요구한다.
http.apply(new JwtSecurityConfig(tokenProvider));
- http.apply(new JwtSecurityConfig(tokenProvider));: JWT 보안 구성을 적용한다. 이전에 정의한 JwtSecurityConfig를 사용하여 JWT 필터를 추가한다.
return http.build();
- return http.build();: 설정한 내용을 기반으로 SecurityFilterChain 객체를 빌드하여 반환한다.
'개인 코드 분석' 카테고리의 다른 글
스프링 시큐리티 Jwt: jwt.TokenProvider (0) | 2024.11.05 |
---|---|
스프링 시큐리티 Jwt: jwt.JwtSecurityConfig (0) | 2024.11.05 |
스프링 시큐리티 Jwt: jwt.JwtFilter (0) | 2024.11.05 |
스프링 시큐리티 Jwt: jwt.JwtAuthenticationEntryPoint (0) | 2024.11.05 |
스프링 시큐리티 Jwt: jwt.JwtAccessDeniedHandler (0) | 2024.11.05 |