JWT와 OAuth 2.0 기초 개념

JWT와 OAuth 2.0 기초 개념

Spring Security를 공부하다 보면 다양한 인증·인가 방식이 등장한다. 그중 JWT와 OAuth 2.0은 현대 웹 애플리케이션에서 필수적인 개념이다.


JWT (JSON Web Token)

개념

토큰 기반 인증 방식으로, JSON 데이터를 안전하게 주고받기 위해 서명을 포함하는 토큰 형식이다.

서버가 세션 상태를 저장하지 않고도(Stateless) 인증 정보를 유지할 수 있다.

구조

JWT는 세 부분으로 구성되며, 마침표(.)로 구분된다.

헤더(Header).본문(Payload).서명(Signature)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4ifQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

구성 요소

구성 요소내용예시
Header토큰 타입, 서명 알고리즘{"alg": "HS256", "typ": "JWT"}
Payload클레임(Claims) - 사용자 정보, 권한, 만료 시간{"sub": "1234", "exp": 1234567890}
Signature헤더 + 페이로드를 비밀 키로 해싱변조 여부 검증용

동작 흐름

┌─────────┐                              ┌─────────┐
│ Client  │                              │ Server  │
└────┬────┘                              └────┬────┘
     │  1. 로그인 요청 (ID/PW)                │
     │ ────────────────────────────────────► │
     │                                        │
     │  2. JWT 발급                           │
     │ ◄──────────────────────────────────── │
     │                                        │
     │  3. 요청 + JWT (Authorization 헤더)    │
     │ ────────────────────────────────────► │
     │                                        │
     │  4. JWT 검증 후 응답                   │
     │ ◄──────────────────────────────────── │

특징

장점단점
Stateless - 서버 부담 감소토큰 탈취 시 만료까지 유효
확장성 - 분산 환경에 적합페이로드 크기가 커질 수 있음
자체 포함(Self-contained)토큰 무효화가 어려움

주의사항

  • Payload는 Base64 인코딩일 뿐 암호화가 아니다 (누구나 디코딩 가능)
  • 민감한 정보는 Payload에 넣지 않는다
  • 반드시 HTTPS와 함께 사용한다

OAuth 2.0 (Open Authorization 2.0)

개념

권한 부여(Authorization) 프레임워크로, 사용자의 자격 증명을 노출하지 않고 타사 애플리케이션이 사용자 데이터에 접근할 수 있도록 권한을 위임한다.

대표적인 예시: “Google 계정으로 로그인”, “카카오로 시작하기”

주요 구성 요소

┌─────────────────────────────────────────────────────────────────┐
│                      OAuth 2.0 구성 요소                         │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   ┌─────────────────┐         ┌─────────────────────────────┐   │
│   │ Resource Owner  │         │    Authorization Server     │   │
│   │   (사용자)      │         │      (권한 부여 서버)        │   │
│   │                 │         │   - 사용자 인증              │   │
│   │  리소스의 주인   │         │   - 액세스 토큰 발급         │   │
│   └─────────────────┘         └─────────────────────────────┘   │
│                                                                 │
│   ┌─────────────────┐         ┌─────────────────────────────┐   │
│   │    Client       │         │     Resource Server         │   │
│   │   (클라이언트)   │         │      (리소스 서버)          │   │
│   │                 │         │                             │   │
│   │  사용자 대신    │         │   사용자 데이터 보관         │   │
│   │  리소스 접근    │         │   (예: Google API)          │   │
│   └─────────────────┘         └─────────────────────────────┘   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
구성 요소역할예시
Resource Owner리소스를 소유한 사용자나 (Google 계정 주인)
Client사용자 대신 리소스에 접근하는 앱내가 만든 앱
Authorization Server사용자 인증 및 토큰 발급Google OAuth 서버
Resource Server사용자 리소스를 호스팅Google API 서버

인가 코드 방식 (Authorization Code Grant)

가장 많이 사용되는 OAuth 2.0 흐름이다.

┌────────┐     ┌────────┐     ┌──────────────┐     ┌──────────────┐
│  User  │     │ Client │     │  Auth Server │     │Resource Server│
└───┬────┘     └───┬────┘     └──────┬───────┘     └──────┬───────┘
    │              │                 │                    │
    │ 1. 로그인 요청│                 │                    │
    │─────────────►│                 │                    │
    │              │                 │                    │
    │ 2. 인가 서버로 리다이렉트        │                    │
    │◄─────────────│                 │                    │
    │              │                 │                    │
    │ 3. 로그인 및 권한 동의           │                    │
    │────────────────────────────────►│                    │
    │              │                 │                    │
    │ 4. 인가 코드 발급 (Redirect)     │                    │
    │◄────────────────────────────────│                    │
    │              │                 │                    │
    │ 5. 인가 코드 전달               │                    │
    │─────────────►│                 │                    │
    │              │                 │                    │
    │              │ 6. 인가 코드로 토큰 요청              │
    │              │────────────────►│                    │
    │              │                 │                    │
    │              │ 7. 액세스 토큰 발급                   │
    │              │◄────────────────│                    │
    │              │                 │                    │
    │              │ 8. 토큰으로 리소스 요청               │
    │              │─────────────────────────────────────►│
    │              │                 │                    │
    │              │ 9. 리소스 응답                        │
    │              │◄─────────────────────────────────────│

토큰 종류

토큰역할특징
Access Token리소스 접근 권한짧은 만료 시간 (보통 1시간)
Refresh TokenAccess Token 재발급긴 만료 시간, 안전하게 보관

JWT vs OAuth 2.0

구분JWTOAuth 2.0
목적인증(Authentication)인가(Authorization)
본질토큰 형식 (데이터 구조)권한 위임 프레임워크
독립 사용가능가능
결합 사용OAuth 2.0의 토큰으로 JWT 사용 가능-
자주 하는 오해 JWT와 OAuth 2.0은 대립 관계가 아니다. OAuth 2.0에서 발급하는 Access Token의 형식으로 JWT를 사용하는 경우가 많다. 서로 보완적인 관계다.

함께 사용하는 예시

OAuth 2.0 흐름
    │
    └─► Authorization Server가 Access Token 발급
            │
            └─► 이때 Access Token을 JWT 형식으로 발급
                    │
                    └─► Resource Server가 JWT 서명 검증으로 토큰 유효성 확인

정리

항목JWTOAuth 2.0
한 줄 정의서명된 JSON 토큰권한 위임 프레임워크
주요 용도사용자 인증 정보 전달제3자 앱에 권한 부여
상태 관리Stateless토큰 기반
사용 예API 인증, SSO소셜 로그인, API 권한 부여

참고