728x90
JWT (JSON Web Token)
웹 애플리케이션에서 로그인 후 사용자 인증 상태를 어떻게 유지할까요? 세션? 쿠키? 이 외에도 현대적인 방식으로 널리 사용되는 것이 바로 JWT(JSON Web Token)입니다.
이 글에서는 JWT의 구조, 동작 원리, 장단점, 그리고 실제 코드 예제까지 포함하여, 실전에서 JWT를 활용할 수 있도록 체계적으로 정리합니다.
1. JWT란?
JWT(JSON Web Token)는 사용자의 인증 정보를 JSON 형식으로 안전하게 전달하기 위한 토큰 기반 인증 방식입니다.
서버는 사용자가 로그인에 성공하면 JWT를 생성해 클라이언트에 전달하고, 클라이언트는 이후 요청마다 이 토큰을 HTTP 헤더에 담아 서버에 전송합니다. 서버는 이 토큰을 검증해 사용자 인증을 처리합니다.
JWT 구조 : 세 부분으로 나뉘는 토큰
JWT는 점(.)으로 구분된 3개의 문자열로 구성됩니다:
xxxxx.yyyyy.zzzzz
구성 요소 | 이름 | 설명 |
Header | 헤더 | 토큰의 타입(JWT)과 서명 알고리즘 정보 |
Payload | 페이로드 | 사용자 정보 및 클레임(Claim) 데이터 |
Signature | 서명 | 헤더 + 페이로드를 비밀키로 서명한 값 (무결성 검증용) |
예시 구조 (Base64 인코딩된 형태)
Header:
{
"alg": "HS256",
"typ": "JWT"
}
Payload:
{
"sub": "user123",
"name": "Alice",
"role": "admin",
"exp": 1713000000
}
- 서버는 이 JWT를 HMAC SHA256 등의 알고리즘으로 서명하여, 위조되지 않았음을 검증할 수 있습니다.
2. JWT의 동작 흐름
- 로그인 요청 : 클라이언트가 서버에 아이디/비밀번호로 로그인을 요청합니다.
- 서버 인증 후 JWT 발급 : 인증 성공 시, 사용자 정보 기반으로 JWT 생성 후 클라이언트에 전달합니다.
- 클라이언트가 JWT 저장 : 로컬스토리지나 세션스토리지에 저장합니다.
- 요청 시 JWT 포함 : 이후 모든 요청에 Authorization: Bearer <토큰> 헤더를 포함합니다.
- 서버가 JWT 검증 : 토큰이 유효하면 요청 처리, 아니면 401 에러 반환합니다.
JWT 실전 예제 (Node.js + jsonwebtoken)
// JWT 생성
const jwt = require('jsonwebtoken');
const token = jwt.sign(
{ userId: 123, name: 'Alice' },
'my-secret-key',
{ expiresIn: '1h' }
);
console.log('JWT:', token);
// JWT 검증
try {
const decoded = jwt.verify(token, 'my-secret-key');
console.log('Decoded:', decoded);
} catch (err) {
console.error('Invalid token');
}
- jsonwebtoken은 Node.js에서 JWT를 생성하고 검증할 수 있게 해주는 대표적인 라이브러리입니다.
3. JWT의 장점과 단점
장점
- 무상태(Stateless) : 서버가 토큰을 저장하지 않아도 됩니다. → 스케일 아웃에 유리
- 빠른 인증 처리 : 요청마다 토큰만 검증하면 됩니다.
- 다양한 플랫폼 지원 : 모바일, SPA 등 다양한 환경에 적합합니다.
- 정보 포함 가능 : 토큰 안에 사용자 정보나 권한을 포함시킬 수 있습니다.
단점 및 보안 이슈
- 토큰 탈취 시 위험 : 토큰은 한번 유출되면 유효 시간 동안 공격에 사용될 수 있습니다.
- 서버에서 토큰 폐기 어려움 : JWT는 기본적으로 서버에서 상태를 저장하지 않기 때문에, 토큰 강제 만료가 어렵습니다.
- 페이로드는 암호화되지 않음 : Base64 인코딩일 뿐, 누구든 디코딩 가능합니다. → 민감 정보는 넣지 말 것
4. JWT와 세션 기반 인증 비교 표
항목 | JWT | 세션 기반 |
저장 위치 | 클라이언트 | 서버 메모리 or DB |
확장성 | 높음 (무상태) | 낮음 (상태 저장 필요) |
보안 | 토큰 탈취 주의 | 세션 하이재킹 주의 |
무효화 | 어렵다 | 서버에서 가능 |
구현 복잡도 | 간단 | 상대적으로 복잡 |
5. JWT 토큰의 주요 사용처
a. Access Token (엑세스 토큰)
- 역할 : 사용자가 로그인 후 인증받았다는 정보를 담고 있습니다.
- 사용처 : 프론트엔드 → 백엔드 API 요청 시 Authorization: Bearer <token> 형태로 헤더에 담아서 보냅니다.
- 내용 : 사용자 ID, 권한, 만료시간 등
- 특징 : 유효기간이 짧고, 탈취 시 보안 위험 있으므로 노출에 주의해야 합니다.
b. Refresh Token
- 역할 : Access Token이 만료되었을 때, 새 Access Token을 발급받는 용도입니다.
- 사용처 : 보통 백엔드 서버나 안전한 저장소에서만 사용합니다.
- 특징 : 비교적 유효기간이 길고, 외부로는 잘 노출하지 않습니다.
c. 세션 대체 용도
- 전통적인 세션/쿠키 기반 인증 대신, JWT를 사용해 stateless한 인증 방식 구현이 가능합니다.
- 서버는 클라이언트 상태를 기억하지 않아도 됩니다. (토큰에 다 들어있음)
d. Single Sign-On (SSO)
- 여러 서비스 간 로그인 연동 시, JWT를 통해 사용자 정보를 공유하는 데 사용합니다.
6. 마무리
JWT는 언제, 왜 써야 할까?
- SPA, 모바일 앱, 마이크로서비스 아키텍처에서는 JWT가 이상적입니다.
- 토큰 기반 인증이 필요한 경우 빠르고 확장성이 좋습니다.
- 단, 보안 이슈(토큰 탈취 등)는 반드시 고려하고, HTTPS 사용과 토큰 관리 정책 필요합니다.
함께 보면 좋은 자료
블로그 글 :
[JWT의 구조] Header, Payload, Signature의 역할과 의미
JWT - Header, Payload, Signature JWT(JSON Web Token)는 사용자 인증과 권한 부여를 위한 대표적인 토큰 기반 방식입니다. 많은 개발자들이 JWT를 사용하면서도 "헤더, 페이로드, 서명이 각각 무슨 역할을 하
dachaes-devlogs.tistory.com
728x90
'컴퓨터 사이언스 > 보안' 카테고리의 다른 글
[Access Token과 Refresh Token] 개발자를 위한 인증 토큰 설명서 (0) | 2025.04.14 |
---|---|
[JWT의 구조] Header, Payload, Signature의 역할과 의미 (0) | 2025.04.14 |
[OpenID Connect] OAuth로는 부족했던 인증을 해결하다. (0) | 2025.04.13 |
[OAuth] OAuth는 인증 기술이 아니다? (0) | 2025.04.12 |
[OAuth] 로그인 없이 로그인하기 (0) | 2025.04.12 |