1. 현상
인증의 영속성을 유지하기 위해서 세션을 활용하려고 하였다.
그리고 아래와 같이 https://docs.spring.io/spring-security/reference/servlet/authentication/persistence.html 가이드에 맞게 코드를 작성하였다.
그런데 로그인 이후에 다른 API를 호출하여도 인증의 영속성이 유지되지 않았고 403 Forbidden 오류가 떨어졌다.
<문제의 코드>
2. 원인
SecurityContextConfigurer 설정 클래스에서는 기본적으로 개발자가 수동으로 SecurityContext를 저장하도록 설정되어 있다.
그렇기 때문에, 각 Request마다 SecurityContext를 저장하는 코드를 작성하지 않아서 영속성이 유지되지 않았던 현상이었다.
3. 해결
이 문제를 해결하기 위해서는
1. 직접 인증 성공 시 SecurityContext를 저장하고 코드를 작성해주거나
2. ttpSecurity를 활용한 securityContext 설정에서 .requireExplicitSave(false)를 호출해줌으로써 해결 가능하다.
나는 2번 항목을 선택하여 최종적으로 아래와 같은 설정 코드를 작성하였고 성공적으로 영속성을 유지할 수 있었다.
그리고 AbstractAuthenticationProcessingFilter를 활용하여 Rest API를 활용한 인증 필터를 작성했을 수 있다.
그런 경우 AbstractAuthenticationProcessingFilter에서 제공해주는 setSecurityContextRepository를 활용하면 된다.
이 메서드를 설정하면 인증 성공 시 SecurityContext를 저장할 SecurityContextRepository를 설정할 수 있다.
이후 인증 성공 시 Spring Security은 명시적으로 SecurityContext를 저장하는 코드를 활용함으로써 SecurityContext를 저장한다.
이 방식을 활용했을 때 내가 만든 최종적인 코드의 형태는 아래와 같다.
4. 공부하게 된 점
- 시간이 오래 걸린다고 느껴지지만 공식 문서와 소스 코드를 보는 것이 트러블 슈팅에 있어서 가장 빠른 시간이다!
출처
https://docs.spring.io/spring-security/reference/servlet/authentication/persistence.html