OAuth2 authorization_request_not_found 오류

Record For a Better Life ·2023년 11월 19일
2

Local과 Http환경에선 잘 돌아가던 Kakao OAuth2가
로드밸런서를 통해 HTTPS로 빌드했더니 authorization_request_not_found 오류가 나타났다.

로드 밸런서 뒤에 여러 인스턴스를 배포할 때 세션이 공유되지 않기 때문에 오류가 발생한다고 나와있다. 로드밸런서를 사용한 https 빌드에서만 이러는 현상을 보아하니 세션과 관련된 오류인 것 같았다.


현재 Login Flow 정리 (Spring Security, OAuth2)

  1. base-uri : 클라이언트에서 요청 시 카카오 로그인 화면으로 연결되는 주소
    https://{{api-server}}/oauth2/authorization/kakao
    - 지정된 scope와 auth code, state, redirect-url을 파라미터로 가진 로그인 화면 리다이렉트

  2. redirect-url : 카카오 로그인 후 최종 인증까지 마쳤을 때 우리 서버로 돌아와야 하는 주소
    https://{{api-server}}/login/oauth2/code/kakao
    - Oauth2LoginAuthenticationFilter → 카카오에서의 콜백 결과가 성공이고 사용자 인증코드 (authorization code)도 포함하고 있다면 Spring Security는 access_token 에 대한 authroization code를 교환하고, customOAuth2UserService 를 호출한다 (Security Config에 정의함)

  3. a. success-redirect-url : 카카오 서버로부터 받아온 인증 정보로 JWT 토큰을 발급한 뒤, 발급에 성공했으면 OAuth2AuthenticationSuccessHandler 로 이동
    https://{{api-server}}/oauth2/redirect?accessToken={{accessToken}}&refreshToken={{refreshToken}}
    b. fail-redirect-url : 발급에 실패했으면 'error' query param에 에러 내용을인코딩해 담아서 OAuth2AuthenticationFailureHandler로 이동
    https://{{api-server}}/oauth2/redirect?error={{encodedErrorMessage}}


문제상황

  • base-uri (1)와 redirect-url (2) 로 연결되는 서버의 세션이 동일해야 인증 정보를 가져와 JWT 토큰을 발급할 수 있으나, 스케일 아웃의 로드밸런서로 분산된 세션으로 인해 리다이렉트 후 인증 정보를 찾을 수 없었다. base-uri (1)를 통해 연결된 로그인에서 사용자의 인증정보가 저장되지만, 인증이 완료된 다음 리다이렉트 되는 redirect-url (2)가 로드밸런서를 통해 다른 서버로 전송되며 기존에 저장했던 세션 인증 정보를 찾을 수 없다.


변경사항

- 로드밸런서 > 대상그룹 > 속성 편집 > 고정 켜기
- 해당 설정을 줌으로써, 모든 요청에 대해 로드밸런서 생성 쿠키에 매칭되는 세션으로 보내줄 수 있음

  • Sticky Session은 세션 불일치 문제를 해결할 수 있으나, 특정 세션의 요청을 최초 처리한 서버로만 전송함으로 인해 서버 과부하가 발생할 수 있으며, 특정 서버 장애 발생 시 연결되어 있는 세션이 모두 소실될 수 있음
  • 대안으로 Session Clustering을 고려할 수 있음

profile
모든 것을 기록하는 벨로그 💻

0개의 댓글