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 Token | Access Token 재발급 | 긴 만료 시간, 안전하게 보관 |
JWT vs OAuth 2.0
| 구분 | JWT | OAuth 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 서명 검증으로 토큰 유효성 확인정리
| 항목 | JWT | OAuth 2.0 |
|---|---|---|
| 한 줄 정의 | 서명된 JSON 토큰 | 권한 위임 프레임워크 |
| 주요 용도 | 사용자 인증 정보 전달 | 제3자 앱에 권한 부여 |
| 상태 관리 | Stateless | 토큰 기반 |
| 사용 예 | API 인증, SSO | 소셜 로그인, API 권한 부여 |
참고
- Spring Security in Action - 로렌티우스 스필카 (위키북스)
- OAuth 2.0 RFC 6749
- JWT.io