본문 바로가기
IT

[OAuth 2.0] 프로젝트에 OAuth 적용(구글 Google)

by 유나니나노 2024. 11. 20.
반응형

oAuth 2.0

개념

  • 인증 및 권한 부여를 위한 인증 프로토콜
  • 제 3자 애플리케이션이 사용자의 자원(ex: 이메일, 프로필 정보 등)에 안전하게 접근할 수 있도록 권한을 위임하는 방식으로 동작
  • 사용자는 자신의 자격 증명(아이디, 비밀번호)를 외부 애플리케이션에 제공하지 않고, 신뢰할 수 있는 권한 서버를 통해 인증 절차를 수행

구성 요소

  • Resource Owner(자원 소유자): 권한을 사용할 수 있는 사용자
  • Client(클라이언트 애플리케이션): 사용자의 권한을 위임받아 자원에 접근하려는 애플리케이션
  • Authorization Server(권한 서버): 사용자의 인증을 처리하고, 클라이언트에게 엑세스 토큰을 발급하는 서버
  • Resource Server(자원 서버): 엑세스 토큰을 검증하고 요청에 따라 자원을 제공하는 서버

 

구글(Google) oAuth 2.0 적용

 

1. Security 및 oAuth 라이브러리 적용

 

2. SecurityConfig 설정

  • SecurityFilterChain에 .oauth2Login 추가
  • userInfoEndpoint
    • 인증된 사용자 정보를 가져오기 위한 엔드포인트
    • userService(customOAuth2UserService)를 통해 인증 후 사용자 정보를 어떻게 가져오고 처리할지 정의
  • customOAuth2UserService
    • 사용자가 인증을 완료하면 이 서비스가 호출되어 사용자 정보를 커스터마이징
  • SuccessHandler
    • OAuth 2.0 인증이 성공적으로 완료된 후 실행되는 핸들러
    • 인증이 완료된 사용자를 위한 추가 작업(ex: JWT 토큰 생성 등)을 처리

  • OAuth2AccessTokenResponseClient
    • OAuth 2.0 인증 흐름 중 하나인 Authorization Code Grant 방식에서 클라이언트가 권한 코드를 사용해 엑세스 토큰을 요청할 때 사용하는 인터페이스
  • DefaultAuthorizationCodeTokenResponseClient
    • Spring Security에서 기본적으로 제공하는 구현체로 권한 코드를 엑세스 토큰으로 교환하기 위해 OAuth 2.0 서버와 통신하는 역할
  • OAuth 2.0 인증 흐름에서 클라이언트와 권한 서버 간의 엑세스 토큰 교환을 처리하는데 사용

3. CustomOAuth2User 클래스

  • OAuth 2.0 인증 후 사용자 정보를 관리하는 커스텀 사용자 객체
  • OAuthUser
    • OAuth 2.0 인증이 완료된 후 사용자의 정보가 담긴 객체
    • 기본적으로 사용자의 속성(Attribute) 정보를 제공하는 역할
  • getAttributes()
    • 사용자의 속성 정보를 반환(이름, 이메일 등)
  • getAuthorities()
    • 사용자의 권한을 반환
    • Spring Security에서 인가(authorization) 처리를 할 때 사용

 

4. CustomOAuth2UserService 클래스

  • OAuth 2.0 인증 후 사용자의 정보를 로드하고 사용자 계정 및 멤버 객체를 생성하거나 기존 계정을 가져오는 로직
  • OAuth2UserService<OAuth2UserRequest, OAuth2User> delegate = new DefaultOAuth2UserService();
    • DefaultOAuth2UserService를 사용해 기본적으로 제공되는 방식으로 사용자 정보를 로드
    • OAuth 2.0 공급자로부터 사용자 정보를 가져오는 역할
  • OAuth2User oAuth2User = delegate.loadUser(userRequest);
    • loadUser 메소드를 호출하여 공급자에게 사용자의 속성 정보를 로드
    • oAuth2User는 사용자의 속성 정보가 포함된 객체
  • 사용자 계정 및 멤버 정보 조회 후 데이터베이스 등록 로직 진행
  • return new CustomOAuth2User(oAuth2User, accountResponse.roles().name());
    • 최종적으로 CustomOAuth2User 객체를 반환
    • oAuth2User와 role이 반환

5. CustomUserDetailService 클래스

  • Spring Security가 인증 과정을 수행할 때 호출되는 메소드로 사용자 정보를 UserDeatils 객체로 반환
  • LoginId를 기반으로 사용자를 조회하고 사용자 정보를 반환
  • 추후에 JWT 인증 과정에서 사용자 여부를 확인하기 위해 사용

 

6. OAuth2SuccessHandler 클래스

  • OAuth 2.0 인증이 성공 후 실행되는 Handler
  • 인증이 성공하면 JWT 토큰을 발급(AccessToken, RefreshToken)
  • 발급된 토큰은 쿠키에 설정하여 클라이언트로 전달

 

**전체적인 흐름 간단 요약**

  1. 사용자가 Google 로그인에서 "확인"을 누르면 Authorization Code획득
  2. OAuth2AccessTokenResponseClient가 Authorization Code로 Access Token을 요청
  3. Spring Security가 Access TokenOAuth2UserRequest에 저장
  4. loadUser 메서드가 OAuth2UserRequest에서 Access Token을 가져와 사용자 정보를 요청

 

 

 

반응형