oauth2Client() - Refresh Token

스프링 시큐리티의 oauth2Login() 필터에 의한 자동 인증 처리를 하지 않고 DefaultOAuth2AuthorizedClientManager 클래스를 사용하여 Spring MVC에서 직접 인증처리를 하는 로그인 기능을 구현한다.

기본 구성

  • AppConfig : DefaultOAuth2AuthorizedClientManager 빈 생성 및 설정 초기화

  • DefaultOAuth2AuthorizedClientManager : OAuth2 권한 부여 흐름 처리

  • LoginController : DefaultOAuth2AuthorizedClientManager를 사용해서 로그인 처리

로그인 구현 순서

  1. DefaultOAuth2AuthorizedClientManager 빈 생성 및 파라미터 초깃값 정의

  2. 권한 부여 유형에 따라 요청이 이루어지도록 application.yml 설정 조정

  3. /oauth2Login 주소로 권한 부여 흐름 요청

  4. DefaultOAuth2AuthorizedClientManager 에게 권한 부여 요청

  5. 권한 부여가 성공하면 OAuth2AuthenticationSuccessHandler를 호출하여 인증 이후 작업 진행

    • DefaultOAuth2AuthorizedClientManager의 최종 반환값인 OAuth2AuthorizedClientOAuth2AuthorizedClientRepository에 저장

  6. OAuth2AuthorizedClient 에서 AccessToken을 참조하여 /userinfo 엔드포인트 요청으로 최종 사용자 정보를 가져온다.

  7. 사용자 정보와 권한을 가지고 인증객체를 만든 후 SecurityContext에 저장하고 인증 완료

  8. 인증이 성공하면 위 과정을 커스텀 필터를 만들어 처리하도록 한다.

img_20.png

예제 코드

application.yml

AppConfig

컨트롤러

과정 디버깅

1. 컨트롤러

  • 처음에는 Resource Owner Password 방식으로 인증이 처리된다.

img_45.png
  • 하지만 커스텀 설정으로 인해 바로 AccessToken이 만료되었고, 다시 재인가 요청을 보낸다.

img_46.png

2. DefaultOAuth2AuthorizedClientManager

  • 이미 인증 받았던 기록이 있다.

img_47.png
img_48.png

3. PasswordOAuth2AuthorizedClientProvider

  • PasswordOAuth2AuthorizedClientProvider에 왔지만, 토큰이 만료되었기 때문에 아무런 처리를 하지 않는다.

img_49.png
  • 그래서 다음 OAuth2AuthorizedClientProviderRefreshTokenOAuth2AuthorizedClientProvider로 간다.

4. RefreshTokenOAuth2AuthorizedClientProvider

  • DefaultRefreshTokenTokenResponseClient를 호출해 OAuth2AccessTokenResponse를 반환 받는다.

  • 그리고 OAuth2AuthorizedClient를 반환한다.

img_50.png

5. DefaultRefreshTokenTokenResponseClient

  • 인가 서버와 통신 후 OAuth2AccessTokenResponse를 반환한다.

img_51.png

6. DefaultOAuth2AuthorizedClientManager

  • authorizationSuccessHandler를 실행하고 authorizedClient를 반환한다.

img_52.png
img_53.png
  • 권한 부여 타입을 변경하고 실행해도 결과는 같다.

  • 다만 과정에 차이가 있는데, DelegatingOAuth2AuthorizedClientProvider에서 PasswordOAuth2AuthorizedClientProvider에서 토큰 만료를 검사하지 않고 건너뛰어서 바로 RefreshTokenOAuth2AuthorizedClientProvider로 간다.

  • 왜냐하면 ClientRegistration의 권한 부여 타입을 새롭게 재정의했기 때문이다.

  • 즉 내부적으로 알아서 처리해주기는 하지만 이렇게 중간에 커스텀하게 필요한 값을 변경하거나 추가할 수도 있는 것이다.


이전 ↩️ - OAuth 2.0 Client(oauth2Client) - DefaultOAuth2AuthorizedClientManager - Client Credentials 권한 부여 구현arrow-up-right

메인 ⏫arrow-up-right

다음 ↪️ - OAuth 2.0 Client(oauth2Client) - DefaultOAuth2AuthorizedClientManager - 필터 기반 구현arrow-up-right

Last updated