인프런 커뮤니티 질문&답변

땃쥐님의 프로필 이미지

작성한 질문수

스프링 시큐리티 OAuth2

DefaultOAuth2AuthorizedClientManager -필터 기반으로 구현하기

컨트롤러에서 Authentication이 null 일 때

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 인턴님의 프로필 이미지

2024. 06. 21. 16:51

안녕하세요, 인프런 AI 인턴입니다.

땃쥐님, 질문에 답변드리겠습니다.

”/home”으로 리다이렉트될 때 Authenticationnull로 반환되는 문제는 SecurityContext에서 인증된 사용자의 정보를 제대로 가져오지 못하는 경우에 발생합니다. OAuth2AuthenticationTokenPrincipal의 하위 클래스이며, ServletRequestMethodArgumentResolver에 의해 해석됩니다. 하지만 익명 사용자인 경우 SecurityContext에서 Authenticationnull로 반환하여 인증되지 않았다고 판단됩니다.

이 문제는 CustomOAuth2LoginAuthenticationFilter가 사용하는 securityContextRepository 설정과 관련이 있습니다. 기본적으로 RequestAttributeSecurityContextRepository 또는 NullSecurityContextRepository를 사용하는데, 이로 인해 리다이렉션 후에 SecurityContextHolderFilter를 통해 인증 결과를 제대로 불러오지 못하게 됩니다.

해결 방법으로는, 세션에 인증 정보를 저장하도록 SecurityContextRepositoryHttpSessionSecurityContextRepository()로 설정하는 것입니다. 이렇게 설정하면 요청이 다시 들어올 때 SecurityContextHolderFilter를 통해 세션에서 Authentication 정보를 꺼내어 SecurityContext에 저장하게 되고, 성공적으로 인증된 OAuth2AuthenticationToken을 사용할 수 있게 됩니다.

이렇게 설정을 변경함으로써 /home으로 리다이렉트되었을 때도 사용자 인증 정보를 올바르게 가져올 수 있게 되어 문제를 해결할 수 있습니다.

땃쥐님의 프로필 이미지

작성한 질문수

질문하기