OAuth2.0Login을 선언하고 몇가지 설정만 해주면 된다.
먼저 SecurityFilterChain
을 구성해 주고
그 안에 oauth2Login을 설정해주면 내부에서 OAuth2LoginConfigurer
가 실행이 된다.
2가지 매서드가 호출되는데 init
과 configure
이다.
먼저 OAuth2LoginAuthenticationFilter
로 기본 url은 /login/oatuh2/code/*
로 요청이 오면 이걸 처리한다. * 은 google, github 등 provider이다.
이를 통해서 AccessToken을 교환하고 사용자 정보 엔드 포인트 요청을 필터한다.
다음으로 OAuth2LoginAuthenticationProvider
로 위 OAuth2LoginAuthenticationFilter
가 요청을 Provider
로 위임을 한다.
나머지 하나는 OidcAuthorizationCodeAuthenticationProvider
이다.
위 OAuth2LoginAuthenticationProvider
는 OAuth2.0이고 해당 Provider는 OIDC를 이용한다.
OAuth2LoginAuthenticationFilter
에서 들어오는 요청 처리
처리 방식으로 OAuth2.0, OIDC가 있다.
둘다 accessCode를 accessToken으로 교환하고, 바꾼 토큰으로 유저 정보를 가져온다.
configure에서는 OAuth2AuthorizationRequestRedirectFilter
가 있다.
이 필터는 임시코드 발급 엔드 포인트 요청 필터이다.
OAuth2.0 flow를 따라서 보면, 먼저 accessCode를 받고 이를 accessToken으로 교환을 하는데
여기서는 accessCode를 받는 역할을 한다.
이 필터가 동작하기 위한 조건 url은 /oauth2/authorization/{registrationId}
이다.
4가지 속성이 있다
기본적으로 생성해 준다.
기본 생성시 OAuth2.0 클라이언트 이름을 보여주고 링크를 눌러 인가를 시작하는데
이때 Url은 /oauth2/authorization/{registrationId}
이다.
이 기본 페이지 재정의는 oauth2Login().loginpage()
를 사용한다.
OAuth2AuthorizationRequestRedirectFilter
에서 브라우저를 통해 인가 서버의 권한 부여 엔드포인트로 리다이렉션 하여 권한 코드 부여 흐름을 시작한다./oauth2/authorization/{registrationId}
로 들어온 요청에 대해 시작하며AuthorizationEndpointConfig. authorizationRequestBaseUri
를 통해 위 주소를 재정의 할 수 있다.DefaultOAuth2AuthorizationRequestResolver
는 요청에 대해서 아래3.에 해당하는 객체를 완성한다./oauth2/authorization/{registrationId}
링크로 들어온 요청에 대해 registrationId를 추출하고 해당하는 ClientRegistration
을 가져와 OAuth2AuthorizatinoRequest
를 만든다.OAuth2AuthorizatinoRequest
는 Accesscode를 AccessToken으로 교환하기 위한 파라미터를 담고 있다.(요청 uri, clientId 등등)OAuth2AuthorizationRequestRepository
는 인가요청 시작~리다이렉트(AccessCode받기)시점까지 OAuth2AuthorizationRequest
를 유지합니다. (flow 진행중 데이터 임시 저장소라고 생각)Request ->
OAuth2AuthorizationRequestRedirectFilter
->DefaultOAuth2AuthorizationRequestResolver
-> 접근권한이 없는 상태로 접근을 시도하면OAuth2AuthorizationRequestRedirectFilter
를 다시 호출 ->/{action}/oauth2/code/{registrationId}
로(action에는 login이 들어감) ->OAuth2AuthorizatinoRequest
->OAuth2AuthorizationRequestRepository
를 구현한HttpSessionOAuth2AuthorizationRequestRepository
에 요청정보 임시 저장 ->Redirect
-> 사용자 인증 -> 정보 받음미인증 상태로 접근시 -> Filter를 호출하여 인증하게 함
인증상태로 접근시 -> 정해진 flow를 따라감
OAuth2LoginAuthenticationFilter
는 받은 code를 AccessToken으로 교환한다.
받은 Token을 OAtuh2LoginAuthenticationToken
으로 저장해서 AuthenticationManager
에 위임해 UserInfo 정보를 조회하고 이를 통해 로그인 한다.
OAuth2AuthorizedClientRepository
에 OAuth2AuthorizedClient
를 저장한다.
인증 성공시 OAuth2AuthenticationToken
이 생성되고 이를 SecurityContext에 저장한다.
요청 Url은 `/login/oauth2/code/*'이다.
OAuth2LoginAuthenticationProvider
는 인가서버로부터 리다이렉트된 이후 AccessToken으로 교환하고, UserInfo 처리를 담당한다.
만약 Openid가 포함되어있으면 OidcAuthorizationCodeAuthenticationProvider
를 호출해 Oidc 처리를 하고 아니면 OAuth2AuthorizationCodeAuthenticationProvider
를 호출해 제어한다
OAuth2LoginAuthenticationProvider
는 기본 OAuth2UserService
를 가지는데 이 서비스는 인가서버와 직접 통신을 담당한다.
1. OAuth2AuthorizationCodeAuthenticationProvider
는 인가 서버로 부터 AccessToken의 교환을 담당한다. 교환 담당은 OAuth2AccessTokenResponseClient
가 한다.
2. OidcAuthorizationCodeAuthenticationProvider
는 OIDC를 이용해 처리한다.
DefaultAuthorizationCodeTokenResponseClient
는 AccessToken을 받아 OAuth2AccessTokenResponse
에 저장하고 반환한다. RestTemplate
을 이용한다.
OAuth2LoginAuthenticationProvider
가 처리하는데
OIDC의 경우OidcAuthorizationCodeAuthenticationProvider
가 처리하고 내부적으로OidcUserService
,DefaultOidcUser
를
아닌 경우OAuth2AuthorizationCodeAuthenticationProvider
가 처리하고 내부적으로DefaultOAuth2UserService
와DefaultOAuth2User
를 가진다.
그리고 이 둘은DefaultAuthorizationCodeTokenResponseClient
를 인가 서버와 통신을 한다.
- State, Code 등 값을 받음(시작)
- redirect시
OAuth2LoginAuthenticationFilter
에서 걸림HttpSessionOAuth2AuthorizationRequestRepository
에 임시 저장한OAuth2AuthorizationRequest
를 가져옴(AccessCode를 만들때 정보)
그리고 서버에서 가져온 Code등의 정보는OAuth2AuthorizationResponse
에 있음(AccessCode를 AccessToken으로 바꾸기 위한 정보)
이 두개의 정보를OAuth2AuthorizationExchange
에 담고 이걸OAuth2LoginAuthenticationToken
에 담는다.OAuth2LoginAuthenticationToken
을ProviderManger
에게 보낸다.ProviderManager
는 타입에 따라 맞는 Provider를 선택(여기선 OAuth2)
따라서 순서대로OAuth2LoginAuthenticationProvider
->OAuth2AuthorizationCodeAuthenticationProvider
가 선택된다.- Provider는
DefaultAuthorizatinCodeTokenResponseClient
를 통해 RestTemplate으로 인가 서버와 통신을 한다.- 통신 결과를
OAuth2AuthorizationCodeAuthenticationToken
에 담는다.OAuth2UserRequest
가 사용자 정보를 인가서버로 부터 가져온다.DefaultOAuth2UserService
가 정보를 가져온다.