Architecture

OAuth2 인증 Flow

백엔드 유성 2025. 4. 12. 20:05

OAuth2 전체 흐름도

 

OAuth2는 서버에서는 사용자의 ID/PW 없이, 인증 서버를 통해 인증을 수행하는 프로토콜입니다.
즉, 사용자가 직접 로그인 정보를 입력하지 않고도 Google, GitHub 등 외부 인증 서비스를 통해 로그인할 수 있게 해줍니다.

 

사용자와 클라이언트 모두 보안에 대한 부담을 낮춰줄 수 있습니다.

 

용어 정리

OAuth2 에서는 의미가 비슷한 용어가 있어서 글에서 아래 용어는 다음과 같은 의미로 사용하겠습니다.

  • 사용자 : 사용자 + 프론트엔드(브라우저) 를 통합한 개념
  • 클라이언트 : OAuth2 인증을 연동하는 애플리케이션 서버 (예: my-service)
  • 인증 서버 : OAuth2 인증을 제공하는 서버 (예: Google, GitHub)

여기서는 흔히 사용되는 구조인 (사용자 - 웹서버 - API서버) 구조로써 Authorization Code Grant 방식으로 설명합니다.

 

0. 클라이언트를 Auth 서버에 등록

google 인증 서버 등록

 

OAuth2를 사용하려면, 먼저 클라이언트(내 서비스)를 인증 서버에 등록해야 합니다.

 

예를 들어 Google 인증을 연동할 경우, Google Cloud Console에서 사용자 인증 정보를 생성합니다.

 

등록 시 제공되는 값:

  • client_id: 클라이언트를 식별하는 고유 ID
  • client_secret: 클라이언트의 정당성을 검증하는 비밀 키
  • redirect_uri: 인증 후 인가 코드를 받을 URI

 

1. 사용자 요청 및 인가 코드 요청

로그인 화면 요청

사용자가 “구글 로그인” 버튼을 누르면,

브라우저는 인증 서버의 Authorization Endpoint로 리디렉션됩니다.

 

전달되는 주요 파라미터는 아래와 같습니다.

  • client_id: 클라이언트의 고유 식별자
  • redirect_uri: 인증 완료 후 인가 코드를 전달받을 URI
  • response_type=code
  • scope: 권한 범위
  • state (CSRF 방지용)
사용자는 인증 화면에서 계정을 선택하고 동의하면,
인가 코드(code)redirect_uri를 통해 클라이언트로 전달됩니다.

 

 

2. 사용자 로그인 및 인가 코드 수신

로그인 성공 후 인가 코드 전달

인증이 완료되면, 인증 서버는 인가 코드를 redirect_uri에 쿼리 파라미터로 사용자에게 전달합니다.

사용자는 code(인가 코드) 를 받아서 클라이언트(callback endpoint) 로 전달합니다.

 

3. 액세스 토큰 요청

 

클라이언트는 인증 서버의 Token Endpoint에 인가 코드를 전달하여 액세스 토큰을 요청합니다

성공 시 인증 서버는 access_token (선택적으로 refresh_token)을 응답합니다.

 

4. 사용자 정보를 세션에 저장 후 로그인 처리

로그인 후 세션 생성

 

클라이언트 서버는 access_token을 사용해 사용자 정보를 조회하거나,

자체적으로 사용자 인증 상태를 저장합니다.

 

이후 세션을 생성하고 SESSIONID를 사용자에게 쿠키로 전달하여 로그인 처리를 완료합니다.

 

 

5. 특정 리소스 접근 시

 

사용자가 로그인된 상태로 서비스의 특정 기능(리소스)에 접근하면,

클라이언트 서버는 세션 정보를 확인하고,

필요한 경우 access_token을 통해 Resource Server에 요청을 보냅니다.

 

리소스 서버는 access_token을 검증한 뒤,

사용자 권한이 유효하다면 리소스를 반환합니다.

 

다음 글에서는 OAuth2 를 Spring Security 사용 없이 구현해보겠습니다.