oauth2Client() - Refresh Token
스프링 시큐리티의
oauth2Login()필터에 의한 자동 인증 처리를 하지 않고DefaultOAuth2AuthorizedClientManager클래스를 사용하여 Spring MVC에서 직접 인증처리를 하는 로그인 기능을 구현한다.
기본 구성
AppConfig:DefaultOAuth2AuthorizedClientManager빈 생성 및 설정 초기화DefaultOAuth2AuthorizedClientManager: OAuth2 권한 부여 흐름 처리LoginController:DefaultOAuth2AuthorizedClientManager를 사용해서 로그인 처리
로그인 구현 순서
DefaultOAuth2AuthorizedClientManager빈 생성 및 파라미터 초깃값 정의권한 부여 유형에 따라 요청이 이루어지도록
application.yml설정 조정/oauth2Login주소로 권한 부여 흐름 요청DefaultOAuth2AuthorizedClientManager에게 권한 부여 요청권한 부여가 성공하면
OAuth2AuthenticationSuccessHandler를 호출하여 인증 이후 작업 진행DefaultOAuth2AuthorizedClientManager의 최종 반환값인 OAuth2AuthorizedClient를OAuth2AuthorizedClientRepository에 저장
OAuth2AuthorizedClient 에서
AccessToken을 참조하여/userinfo엔드포인트 요청으로 최종 사용자 정보를 가져온다.사용자 정보와 권한을 가지고 인증객체를 만든 후
SecurityContext에 저장하고 인증 완료인증이 성공하면 위 과정을 커스텀 필터를 만들어 처리하도록 한다.

예제 코드
application.yml
AppConfig
컨트롤러
과정 디버깅
1. 컨트롤러
처음에는 Resource Owner Password 방식으로 인증이 처리된다.

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

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


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

그래서 다음
OAuth2AuthorizedClientProvider인RefreshTokenOAuth2AuthorizedClientProvider로 간다.
4. RefreshTokenOAuth2AuthorizedClientProvider
DefaultRefreshTokenTokenResponseClient를 호출해OAuth2AccessTokenResponse를 반환 받는다.그리고
OAuth2AuthorizedClient를 반환한다.

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

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


권한 부여 타입을 변경하고 실행해도 결과는 같다.
다만 과정에 차이가 있는데,
DelegatingOAuth2AuthorizedClientProvider에서PasswordOAuth2AuthorizedClientProvider에서 토큰 만료를 검사하지 않고 건너뛰어서 바로RefreshTokenOAuth2AuthorizedClientProvider로 간다.왜냐하면
ClientRegistration의 권한 부여 타입을 새롭게 재정의했기 때문이다.즉 내부적으로 알아서 처리해주기는 하지만 이렇게 중간에 커스텀하게 필요한 값을 변경하거나 추가할 수도 있는 것이다.
다음 ↪️ - OAuth 2.0 Client(oauth2Client) - DefaultOAuth2AuthorizedClientManager - 필터 기반 구현
Last updated