Social Login - 내부 프로세스
사용자가 /oauth2/authorization/{registartionId}를 누르면
Google

인가 서버로부터 임시 코드를 발급받는 요청 하는 필터

권한 부여 코드 타입 체크
인가 서버에게 코드를 발급받기 위해 요청하는 객체 OAuth2AuthorizationRequest 를 저장하는 것을 볼 수 있다.
nonce: OpenID 요청을 위해 필요한 매개 변수
authorizationRequestUri: 인가 서버에게 보낼 최종 Uri이후
sendRedirec()를 실행하면 실제 구글에 요청을 보내게 되고, 화면에는 사용자가 인증(로그인) 하기 위한 화면이 나온다.사용자가 인증을 마치면 지정한 리디렉션 Uri를 다시 이 필터가 받는다.
이 필터는 액세스 토큰 교환 요청을 위해
OAuth2LoginAuthenticationFilter를 호출한다.

param에는 임시 코드를 요청하고 인가 서버에서 보낸
redirect_uri로 보낸 정보들이 담겨있다.
code: 액세스 토큰을 발급받기 위해서 받은code값으로 그대로 요청해야 한다.
스코프에
openid가 있는지 확인한다.openid가 있기 때문에 다음 provider 를 호출한다.
Oidc 요청을 처리할 수 있는
OidcAuthorizationCodeAuthenticationProvider로 넘어간다.

OAuth2AccessTokenResponse를 얻어오는 과정에서 구글은 기본적으로
Basic방식으로 전달한다.openid를 지원하는 구글은
id_token도 함께 응답한다.
OidcToken 은 내부적으로
JwtDecoder에 의해 세세한 검증을 통과해야 생성된다.여기서 실행하는
loadUser()는 직접 만든CustomOidcUserService에서 실행된다.loadUser()내부적인 과정에서id_token만으로 인증이 되기 때문에 다시 인가 서버와 통신은 건너뛰게 된다.mapAuthorities() 과정은 직접 정의한
CustomAuthorityMapper에 의해 매핑된다.
4. Spring MVC
수 많은 필터들을 거쳐 SecurityContext에 저장되고, 우리는 스프링 MVC에서 Authentication을 참조할 수 있다.

OAuth2AuthenticationToken타입으로principal = OidcUser외에 정보를 저장한다.
Naver
네이버도 구글과 초반 과정은 똑같고, 네이버는 openid를 지원하지 않으므로 OidcAuthorizationCodeAuthenticationProvider가 아니라 OAuth2AuthorizationCodeAuthenticationProvider로 넘어간다.
OAuth2AuthorizationCodeAuthenticationProvider

OAuth2LoginAuthenticationProvider에서는CustomOAuth2UserService에서loadUser()처리를 하게 된다.

네이버는
principal = OAuth2User로 저장되며,attributes의 사용자 정보가response로 묶여있는 것을 확인할 수 있다.
참고로 OpenID 인증의 경우 권한이
ROLE_대신OIDC_로 되고, OAuth 2.0 인증의 경우ROLE_대신OAUTH2_로 된다.
이전 ↩️ - OAuth 2.0 Client(Social Login) - 코드 구현
다음 ↪️ - OAuth 2.0 Client(Social Login) - 폼 인증 & 카카오 추가 및 리팩토링
Last updated







