OAuth2 인증 방식

·2024년 6월 11일

Spring Security

목록 보기
13/13

유튜브 "개발자 유미" 님 강의를 듣고 정리한 내용입니다.

OAuth2

OAuth2.0는(이하 OAuth2) 외부 소셜 로그인 서비스를 통해서 우리 측 애플리케이션 인증을 할 수 있도록 도와준다.
잘 알려지고 신뢰할 수 있는 서비스들로부터의 인증을 통해서 안전하게 사용자 정보에 접근할 수 있다는 장점을 가진다. 또한 여러 서비스와 쉽게 통합할 수 있다.

폼 로그인과의 비교

폼 로그인과 비슷한 flow로 처리된다. 하지만 외부 서비스를 사용하기 때문에, 폼 로그인의 인증과는 다르다.

실질적인 인증 과정을 Provider Manager에 의해 호출되는 Provider가 담당했었다. 실제 인증 및 인가를 처리하는 것은 외부 서비스이기 때문에, OAuth2를 사용할 땐 외부 서비스로 인가 코드를 받고, 이를 사용해 액세스 토큰을 부여 받는 등의 작업을 하게 된다.

폼 로그인의 프로세스

역할별 비교

폼 로그인OAuth 로그인
필터UsernamePasswordAuthenticationFilterOAuth2LoginAuthenticationFilter
실질적인 인증 처리DaoAuthenticationProviderOAuth2LoginAuthenticationProvider
유저 정보 처리UserDetailsServiceOAuth2UserService
유저 정보(Principal)UserDetailsOAuth2User
Provider Manager로 위임되는 토큰UsernamePasswordAuthenticationTokenOAuth2LoginAuthenticationToken

OAuth2 인증, 인가 과정

이미지 출처 : 유튜브 "개발자 유미"님
https://substantial-park-a17.notion.site/3-f3f3a6175f6746aea450e13f4eb6199c

     +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+

다이어그램 출처 : https://datatracker.ietf.org/doc/html/rfc6749#section-1.2

위 다이어그램에서 client는 우리 측 서버를 의미함.

(A) 인증 및 인가 요청

  1. 인증 및 인가 요청 경로인 /oauth2/authorization/{서비스명}(default)를 통해 인증 및 인가을 요청한다.

  2. OAuth2AuthorizationRequestRedirectFilter가 인증 및 인가를 요청한다.(Authorization Uri(EndPoint)로 리다이렉트)

  3. 외부 서비스의 로그인 페이지를 응답받아서 사용자가 로그인을 시도한다.

(B) 인가 코드 응답

  1. 외부 서비스의 인증 + 인가 서버에서는 인증을 완료한 후, 우리 서버 측에서 미리 등록해둔 리다이렉션 엔드 포인트인 /login/oauth2/code/{서비스명}(default)으로 리다이렉트하여 인가 코드를 보낸다.

(Authorization Grant로 인가 코드(Authorization code)를 받는 경우에, Resource Owner에게 요청 후에 Resource Server를 거쳐서 받게 됨. 인증 코드는 가장 일반적인 권한 부여 방식이다.)

(C) 액세스 토큰 요청

  1. OAuth2LoginAuthenticationFilter가 인가 코드를 사용하여 외부 서비스 리소스 서버부터 Access Token을 요청한다. (Token Uri(EndPoint)로 요청)

(D) 액세스 토큰 응답

  1. 외부 서비스의 리소스 서버는 code와 등록 정보를 사용하여 요청을 보낸 클라이언트(우리 측 서버)가 유효한 사용자인지 인증한 후, Access Token을 응답한다.

(E) 사용자 정보 요청

  1. OAuth2AuthenticationProviderOAuth2UserService를 통해서 Access Token을 사용할 수 있다. OAuth2UserServiceUserInfo Uri(EndPoint)로 사용자 정보를 요청한다.

(F) 사용자 정보 응답

  1. 외부 서비스 리소스 서버가 사용자 정보를 응답한다.

우리 측 서버의 추가 작업

  1. OAuth2UserService는 사용자 정보를 응답받고, 이를 통해 OAuth2UserPrincipal을 저장한다.

  2. OAuth2User의 Principal을 사용하여 세션 저장과 같은 추가적인 작업을 통해 로그인을 완료한다.

OAuth2 인증 시에는 외부 서비스에 장애가 일어나면 인증을 할 수 없다는 단점도 존재한다. 그렇기 때문에 OAuth2 인증 방식과 더불어 다른 인증 방식을 추가로 사용하는 것이 권장된다.

참고 : https://godekdls.github.io/Spring%20Security/oauth2/#oauth2authorizedclientrepository--oauth2authorizedclientservice

profile
티스토리로 블로그 이전합니다. 최신 글들은 suhsein.tistory.com 에서 확인 가능합니다.

0개의 댓글