컴퓨터공학
JWT(JSON Web Token) 인증 방식 개념
nyambu
2025. 3. 18. 08:00
1. JWT란?
JWT(JSON Web Token)는 웹 애플리케이션에서 사용자 인증 및 권한 부여를 위해 사용되는 토큰 기반 인증 방식이다. JWT는 서버에서 발급한 토큰을 클라이언트가 저장하고, 이후 요청 시 해당 토큰을 이용해 인증을 수행하는 방식으로 동작한다.
📌 JWT의 특징
- 토큰 기반 인증 방식 → 서버가 세션을 저장할 필요 없음 (무상태성)
- JSON 형식 사용 → 가볍고, 웹에서 쉽게 활용 가능
- 디지털 서명 포함 → 토큰이 변조되지 않도록 보안 강화
- 다양한 환경에서 사용 가능 → 웹, 모바일, 마이크로서비스 등
📌 JWT 인증 방식이 필요한 이유
- 세션 기반 인증의 문제점 해결
- 확장성 높은 인증 시스템 구축 가능
- REST API와 잘 어울리는 인증 방식
2. JWT의 구조
JWT는 **세 부분(헤더, 페이로드, 서명)**으로 구성되며, 각각 Base64URL 인코딩되어 하나의 문자열로 결합된다.
📌 JWT 구조
HEADER.PAYLOAD.SIGNATURE
📌 예제 JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJ1c2VySWQiOjEsInJvbGUiOiJ1c2VyIiwiaWF0IjoxNjk5MjM1MjAwLCJleHAiOjE2OTkyMzg4MDB9
.CWqTQGx9mE_J5JfdKzRJSmD-G1KgL2vT4UK9byJzv0w
2-1. Header (헤더)
{
"alg": "HS256",
"typ": "JWT"
}
- alg: 서명에 사용할 알고리즘 (예: HS256)
- typ: 토큰 타입 (항상 JWT)
2-2. Payload (페이로드)
{
"userId": 1,
"role": "user",
"iat": 1699235200,
"exp": 1699238800
}
- userId: 사용자 ID
- role: 사용자 역할 (예: admin, user)
- iat: 토큰 발급 시간 (Issued At)
- exp: 토큰 만료 시간 (Expiration)
2-3. Signature (서명)
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secretKey
)
- 서명(Signature)은 토큰 위변조 방지를 위해 사용됨
- secretKey는 서버에서만 알고 있어야 함
3. JWT 인증 방식의 동작 과정
JWT를 활용한 인증은 다음과 같은 단계를 따른다.
3-1. 로그인 요청
사용자가 ID/PW로 로그인하면, 서버는 인증 후 JWT를 발급한다.
📌 클라이언트 → 서버 요청 (로그인)
POST /login
Content-Type: application/json
{
"username": "user1",
"password": "mypassword"
}
📌 서버 → 클라이언트 응답 (JWT 발급)
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
3-2. 요청 시 JWT 포함
클라이언트는 이후 API 요청 시 JWT를 **HTTP 헤더(Authorization)**에 포함시켜 보낸다.
📌 JWT 포함 요청 (클라이언트 → 서버)
GET /user/profile
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
📌 서버에서는 JWT 검증 후 요청 처리
1. Authorization 헤더에서 JWT 추출
2. 서명을 검증하여 토큰의 유효성 확인
3. 토큰이 유효하면 요청을 처리
3-3. JWT 검증
서버는 **서명(Signature)**을 검증하여 토큰이 변조되지 않았는지 확인한다.
📌 JWT 검증 과정
- Header, Payload 분리
- 서버의 secret key를 사용하여 서명(Signature) 생성
- 요청된 JWT의 서명과 비교
- 일치하면 요청 처리, 불일치하면 인증 실패
📌 JWT 유효하지 않은 경우 응답
{
"status": 401,
"message": "Invalid token"
}
4. JWT의 장점과 단점
1) 장점
- 무상태성(Stateless) → 서버가 세션을 저장할 필요 없음
- 확장성(Scalability) 좋음 → 여러 서버에서 인증 가능
- 빠른 인증 → 데이터베이스 조회 없이 토큰으로 인증 가능
2) 단점
- 토큰 탈취 위험 → JWT가 유출되면 누구나 사용 가능
- 토큰 크기 증가 → 페이로드가 커질수록 성능 저하 가능
- 만료된 토큰 강제 무효화 어려움 → 즉시 로그아웃 불가능
📌 JWT 보안 강화 방법
- HTTPS 사용하여 토큰 암호화 전송
- 토큰을 HTTP Only & Secure 쿠키로 저장
- 짧은 만료 시간 설정 & 리프레시 토큰 사용
5. JWT vs 세션 기반 인증
JWT는 세션 기반 인증과 비교했을 때 장단점이 있다.
비교 항목 |
JWT 인증 | 세션 기반 인증 |
서버 상태 | 무상태(Stateless) | 상태 유지(Stateful) |
확장성 | 우수 | 낮음 (서버 간 세션 공유 필요) |
저장 위치 | 클라이언트 (로컬) | 서버 (세션 저장소) |
보안성 | 탈취 시 위험 | 서버에서 관리 가능 |
사용 예시 | 마이크로서비스, REST API | 전통적인 웹 애플리케이션 |
- RESTful API 인증
- 마이크로서비스 아키텍처 (MSA)
- 모바일 & SPA (Single Page Application)
2)세션 기반 인증이 적합한 경우
- 일반적인 웹사이트 (세션 저장이 용이할 때)
- 로그인된 사용자 정보를 서버에서 관리할 필요가 있을 때
6. JWT 인증 구현 (Node.js + Express)
📌 JWT 발급 예제
const jwt = require('jsonwebtoken');
const secretKey = "mySecretKey";
const payload = { userId: 1, role: "admin" };
const token = jwt.sign(payload, secretKey, { expiresIn: "1h" });
console.log("JWT:", token);
📌 JWT 검증 예제
try {
const decoded = jwt.verify(token, secretKey);
console.log("Decoded:", decoded);
} catch (error) {
console.log("Invalid Token");
}