개발 블로그
Published 2023. 4. 27. 21:07
[TIL] DAY 25 항해99

오늘 겪은 문제

JWT 유효성 검사를 하는 커스텀 필터를 만들어 UsernamePasswordAuthenticationFilter 이전에 추가하여 유효하지 않은 토큰일 경우 response 에 에러 메시지를 담아 반환하게 했다.

 

그리고 유효한 토큰일 경우에만 Security Context에 인증 객체를 저장하도록 해서 만약 토큰이 비어있는 경우에는 다음 필터에서 걸러지도록 코드를 작성했다.

 

그런데 유효하지 않은 토큰에 대해서는 올바르게 처리가 됐지만 빈 토큰(null) 으로 요청을 보낼 경우 필터에서 걸러지지 않고 컨트롤러를 통과해버리는 문제가 있었다.

 

 

시도해본 것

1. token == null 일 경우 커스텀 필터를 통과하지 못 하도록 처리

이 방법으로 빈 토큰에 대한 필터링은 가능했으나 애초에 토큰이 필요하지 않아 token == null 인 요청들까지 같이 필터를 통과하지 못 하는 상황이 발생했다.

 

2. request.getRequestURI() 이용해 토큰이 필요한 요청을 별도로 처리

토큰이 필요한데 토큰이 null 인 경우를 요청 URI 를 확인하여 처리해줄 수는 있었으나 이러한 케이스의 요청 URI 가 많아진다면 코드가 너무 길어지는 문제가 발생했다.

 

 

해결 방법

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    ~
    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    ~
    
    return http.build();
}

내가 겪은 문제는 스프링 시큐리티가 기본 방식으로 Session 방식을 이용하고 있어 생긴 문제였다.

 

Session 방식에서는 클라이언트가 유효한 session id를 가지고 있으면 필터를 통과할 수 있어 jwt 토큰이 null 이어서 Security Context에 저장할 인증 객체를 만들지 않아도 다음 필터들을 잘 통과했던 것이다.

(내가 별도로 생성하는 쿠키가 없으면 톰캣 서버에서 자체적으로 JSESSIONID를 발급)

 

그래서 위 코드를 통해서 기본 방식인 Session 방식을 이용하지 않겠다고 선언을 해주면 추후 지나가는 필터들에서 session id 기반이 아니라 Security Context 에 저장된 인증 객체를 기반으로 필터를 통과시킬지 말지를 결정할 수 있게 된다.

 

인증 객체의 저장은 JWT 가 유효할 경우에만 일어나도록 커스텀 필터에서 설정해주었기 때문에 앞서 발생했던 token == null 일 때 필터를 모두 통과하는 문제가 해결된 것이다.

'항해99' 카테고리의 다른 글

[WIL] 항해 4주차  (0) 2023.05.01
[TIL] DAY 27  (0) 2023.04.29
[TIL] DAY 24  (0) 2023.04.26
[TIL] DAY 22  (0) 2023.04.24
[WIL] 항해 3주차  (0) 2023.04.23
profile

개발 블로그

@하얀.손

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!