24.06.19 16:48 작성
·
113
·
수정됨
0
"/home" 으로 리다이렉트 할 떄 Authentication 이 null로 가져와지는 문제가 있습니다.
왜 그럴까?
OAuth2AuthenticationToken 은 Principal의 하위 클래스입니다. 이는 ServletRequestMethodArgumentResolver 에서 잡아서 resolve 해줍니다.
그런데 여기서 resolve 하는 과정에서 SecurityContext로부터 Authentication 을 꺼내는데 익명사용자일 경우 null 로 반환하게 됩니다. 인증되지 않았다는 것이죠.
아까 우리는 인증을 했지만 이 결과가 장기적인 저장을 담당하는 SecurityContextRepository에 저장이 제대로 되지 않았기 때문입니다.
CustomOAuth2LoginAuthenticationFilter 의 부모인 AbstractAuthenticationProcessingFilter 가 사용하는 securityContextRepository가 RequestAttributeSecurityContextRepository 또는 NullSecurityContextRepository(예전버전 기준) 로 되어 있습니다.
이렇게 되어 있으면 다시 "/home" 으로 리다이렉트되어 요청될 때 SecurityContextHolderFilter에서 인증 결과를 못 불러오는 문제가 생깁니다.
실습의 편의상 세션에 저장하는게 좋은데, filter.setSecurityContextRepository(HttpSessionSecurityContextRepository())
코드를 추가하셔서 설정하시면 될 것 같습니다.
다시 요청이 들어왔을 때 SecurityContextHolderFilter를 거치면서 세션의 Authentication 을 꺼내서 SecurityContext에 담아주기 때문에 성공적으로 인증된 OAuth2AuthenticationToken 을 바인딩 받으실 수 있을겁니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
땃쥐님, 질문에 답변드리겠습니다.
”/home”으로 리다이렉트될 때 Authentication
이 null
로 반환되는 문제는 SecurityContext
에서 인증된 사용자의 정보를 제대로 가져오지 못하는 경우에 발생합니다. OAuth2AuthenticationToken
은 Principal
의 하위 클래스이며, ServletRequestMethodArgumentResolver
에 의해 해석됩니다. 하지만 익명 사용자인 경우 SecurityContext
에서 Authentication
을 null
로 반환하여 인증되지 않았다고 판단됩니다.
이 문제는 CustomOAuth2LoginAuthenticationFilter
가 사용하는 securityContextRepository
설정과 관련이 있습니다. 기본적으로 RequestAttributeSecurityContextRepository
또는 NullSecurityContextRepository
를 사용하는데, 이로 인해 리다이렉션 후에 SecurityContextHolderFilter
를 통해 인증 결과를 제대로 불러오지 못하게 됩니다.
해결 방법으로는, 세션에 인증 정보를 저장하도록 SecurityContextRepository
를 HttpSessionSecurityContextRepository()
로 설정하는 것입니다. 이렇게 설정하면 요청이 다시 들어올 때 SecurityContextHolderFilter
를 통해 세션에서 Authentication
정보를 꺼내어 SecurityContext
에 저장하게 되고, 성공적으로 인증된 OAuth2AuthenticationToken
을 사용할 수 있게 됩니다.
이렇게 설정을 변경함으로써 /home
으로 리다이렉트되었을 때도 사용자 인증 정보를 올바르게 가져올 수 있게 되어 문제를 해결할 수 있습니다.