@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.cors(Customizer.withDefaults())
// token을 사용하는 방식이기 때문에 csrf를 disable합니다.
.csrf(AbstractHttpConfigurer::disable)
.sessionManagement((sessionManagement) ->
sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
.formLogin((formLogin) -> formLogin.disable())
// enable h2-console
.headers((headers) ->
headers.contentTypeOptions(contentTypeOptionsConfig ->
headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin)))
.authorizeHttpRequests((authorizeRequests) ->
authorizeRequests
.requestMatchers(HttpMethod.OPTIONS, "/**/*").permitAll()
//users 포함한 end point 보안 적용 X
.requestMatchers("/users/**").permitAll() // HttpServletRequest를 사용하는 요청들에 대한 접근제한을 설정하겠다.xw
.requestMatchers(HttpMethod.GET,"/tags/**").permitAll()
.requestMatchers("/oauth2/authorization/**").permitAll()
.requestMatchers("/login/oauth2/code/**").permitAll()
.requestMatchers("/users/profile/**").permitAll() // 개인 정보 수정은 권한 필요
.requestMatchers("/error/**").permitAll()
.requestMatchers(HttpMethod.GET, "/memos/**").permitAll()
.requestMatchers(HttpMethod.GET, "/mypage/**").permitAll()
.requestMatchers(HttpMethod.GET,"/comments/**").permitAll()
.requestMatchers("/swagger-ui/**", "/v2/api-docs",
"/swagger-resources",
"/swagger-resources/**",
"/configuration/ui",
"/configuration/security",
"/swagger-ui.html",
"/webjars/**",
/* swagger v3 */
"/v3/api-docs/**",
"/swagger-ui/**").permitAll()
.requestMatchers("/favicon.ico").permitAll()
.anyRequest().authenticated() // 그 외 인증 없이 접근X
)
.oauth2Login(oauth2 -> oauth2
.clientRegistrationRepository(clientRegistrationRepository)
.userInfoEndpoint(it -> it.userService(oAuthService))
.successHandler(oAuthAuthenticationSuccessHandler))
.exceptionHandling((exceptionHandling) -> exceptionHandling
.accessDeniedHandler(jwtAccessDeniedHandler)
.authenticationEntryPoint(jwtAuthenticationEntryPoint))
.apply(new JwtSecurityConfig(tokenProvider,domain)); // JwtFilter를 addFilterBefore로 등록했던 JwtSecurityConfig class 적용
return httpSecurity.build();
}
permitAll
되어 있는 api 요청을 보내도, 해당 요청의 log를 살펴보면
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}%highlight([%-5level]) %class{36}.%M ${PID:-} : %msg%n</pattern>
이렇게 log가 찍힌다.
AnonymousAuthenticationFilter가 작동하는 것을 보면, security filter도 거치는 것임을 알 수 있다.
.requestMatcher(~~).permitAll()
로 하게 되면, authentication객체를 무시하는 것일 뿐(인증이 성공) 필터를 거치긴 한다.