
사이드 프로젝트 중 발생
현재 사이드 프로젝트의 인증 인가 구조
Authentication 데이터가 SecurityContext에 저장 되고 있는지 확인하기 위해 직접 구현한 AuthenticationFilter에서 Context 객체의 데이터를 조회하여 로깅하였다SecurityContext 객체 내부에 Authentication 데이터가 NULL 값으로 확인 됨문제 발생 코드
// SecurityConfig.java
//..........
.apply(new CustomFilterConfig())
.and()
.httpBasic().disable()
.headers()
.addHeaderWriter(new XFrameOptionsHeaderWriter(
XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN))
.and()
.formLogin().disable()
.logout().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
return http.build();
}
public class CustomFilterConfig extends AbstractHttpConfigurer<CustomFilterConfig, HttpSecurity> {
@Override
public void configure(HttpSecurity builder) throws Exception {
JwtVerificationFilter jwtVerificationFilter = new JwtVerificationFilter(jwtTokenizer, authorityUtils);
builder.addFilterBefore(jwtVerificationFilter, SecurityContextHolderFilter.class);
}
}
//.......
CustomFilterConfig 정상적으로 적용 해 주고 있음addFilterBefore(jwtVerificationFilter, SecurityContextHolderFilter.class); 부분 이다SecurityContextHolderFilter 의 역할이 단순 Context 데이터를 확인하는 필터로 착각하였기에 .addFilterBefore() 를 활용하여 SecurityContextHolderFilter 가 적용되기 이전에 JwtVerificationFilter(권한 부여 Filter)를 적용 하였다.SecurityContextHolderFilter의 코드를 확인 한 결과 doFilter() 에서 SecurityContextHolderStrategy에 SecurityContert 객체를 설정 해 주고 있었다.// SecurityContextHolderFilter.java
// ............
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
doFilter((HttpServletRequest) request, (HttpServletResponse) response, chain);
}
private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
if (request.getAttribute(FILTER_APPLIED) != null) {
chain.doFilter(request, response);
return;
}
request.setAttribute(FILTER_APPLIED, Boolean.TRUE);
Supplier<SecurityContext> deferredContext = this.securityContextRepository.loadDeferredContext(request);
try {
this.securityContextHolderStrategy.setDeferredContext(deferredContext);
chain.doFilter(request, response);
}
finally {
this.securityContextHolderStrategy.clearContext();
request.removeAttribute(FILTER_APPLIED);
}
}
// ............

SecurityContext 의 Authentication 객체는 NULL 값이였다.SecurityContext 객체를 SecurityContextHolderStrategy 설정을 해주기도 전에 권한 부여 Filter에서 권한을 설정 해주는 상황이다SecurityContext 설정 후 FilterChain을 통해 다음 필터로 이동하여, 권한 부여 Filter에서 Authentication을 설정 해 주어야 한다개선 코드
//SecurityConfig.java
//........
public class CustomFilterConfig extends AbstractHttpConfigurer<CustomFilterConfig, HttpSecurity> {
@Override
public void configure(HttpSecurity builder) throws Exception {
JwtVerificationFilter jwtVerificationFilter = new JwtVerificationFilter(jwtTokenizer, authorityUtils);
builder.addFilterAfter(jwtVerificationFilter, SecurityContextHolderFilter.class);
}
}
//.......
ScurityConfig의 CustomFilterConfig 내부에서 addFilterBefore() -> addFilterAfter()로 변경하였다SecurityContextHolderFilter 적용 후에 권한 부여 Filter가 동작 하는 것을 확인Authentication도 정상적으로 설정 되어 권한 부여가 동작 하게 되었다.