jwt-security은(는) 무엇을 하나요?
JWT 인증 구현 가이드: 토큰 생성, 검증 및 저장에 대한 보안 모범 사례
개요
이 스킬은 JWT(JSON Web Token) 기반 인증 시스템을 안전하게 구현하기 위한 지침을 제공합니다. 다음 영역을 다룹니다:
- 토큰 생성: 서명 알고리즘, 만료, 클레임 설정
- 토큰 검증: 서명, 만료, 발급자, 대상자 검증
- 토큰 저장: 클라이언트 측 안전한 저장소 및 XSS 방지
보안 원칙
1. 강력한 서명 알고리즘 사용
HS256(HMAC with SHA-256) 또는RS256(RSA with SHA-256) 사용none알고리즘 절대 사용 금지- 약한 알고리즘(예:
HS256을none으로 다운그레이드) 방지
2. 짧은 만료 시간 설정
{
"exp": 1710000000,
"iat": 1709996400
}
- 만료 시간(
exp)을 15분 이내로 설정 - 갱신 토큰을 사용하여 재인증
3. 필수 클레임 검증
| 클레임 | 설명 | 필수 여부 |
|---|---|---|
iss | 발급자 | 예 |
sub | 주제 (사용자 ID) | 예 |
aud | 대상자 | 예 |
exp | 만료 시간 | 예 |
iat | 발급 시간 | 예 |
jti | JWT ID (중복 방지) | 권장 |
4. 안전한 저장소
- HttpOnly 쿠키:
Secure,SameSite=Strict속성과 함께 사용 - 로컬 스토리지 지양: XSS 공격에 취약하므로 사용하지 않음
구현 예제
Node.js (jsonwebtoken 라이브러리)
const jwt = require('jsonwebtoken');
// 토큰 생성
const token = jwt.sign(
{ sub: 'user123', role: 'admin' },
process.env.JWT_SECRET,
{ algorithm: 'HS256', expiresIn: '15m', issuer: 'myapp' }
);
// 토큰 검증
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET, {
algorithms: ['HS256'],
issuer: 'myapp'
});
console.log('유효한 토큰:', decoded);
} catch (err) {
console.error('토큰 검증 실패:', err.message);
}
Python (PyJWT 라이브러리)
import jwt
from datetime import datetime, timedelta
# 토큰 생성
payload = {
'sub': 'user123',
'role': 'admin',
'exp': datetime.utcnow() + timedelta(minutes=15),
'iss': 'myapp'
}
token = jwt.encode(payload, 'your-secret-key', algorithm='HS256')
# 토큰 검증
try:
decoded = jwt.decode(token, 'your-secret-key', algorithms=['HS256'], issuer='myapp')
print('유효한 토큰:', decoded)
except jwt.ExpiredSignatureError:
print('토큰이 만료되었습니다.')
except jwt.InvalidTokenError as e:
print('잘못된 토큰:', str(e))
환경 변수
| 변수명 | 설명 | 예시 |
|---|---|---|
JWT_SECRET | HS256 서명에 사용되는 비밀 키 | your-256-bit-secret |
JWT_ISSUER | 토큰 발급자 식별자 | https://api.example.com |
JWT_AUDIENCE | 대상 애플리케이션 | https://app.example.com |
JWT_EXPIRY | 토큰 만료 시간 (분) | 15 |
주의 사항
- 비밀 키를 코드에 하드코딩하지 마세요. 환경 변수나 비밀 관리 서비스를 사용하세요.
- 토큰 블랙리스트를 구현하세요. 로그아웃 시 토큰을 무효화합니다.
- HTTPS를 사용하세요. 전송 중 토큰을 암호화합니다.
- 페이로드에 민감한 정보를 포함하지 마세요. JWT는 서명만 되고 암호화되지 않습니다.