JWT 개념 이해
1️⃣ JWT (JSON Web Token) 란?
JWT는 클라이언트와 서버 간에 인증 정보를 안전하게 전달하기 위한 토큰 기반의 인증 방식입니다.
주로 로그인 이후 인증 상태를 유지하는 용도로 사용되며, 자체적으로 정보를 담고 있어 별도의 저장소없이 검증이 가능합니다.
2️⃣ 왜 JWT르 쓰는가?
🔹 세션 기반 인증 vs JWT 기반 인증
| 항목 | 세션 기반 인증 | JWT 기반 인증 |
|---|---|---|
| 저장 위치 | 서버 메모리/DB 세션 저장 | 클라이언트(주로 브라우저)에 JWT 저장 |
| 확장성 | 서버에 저장공간 필요 → 확장 어려움 | 무상태(stateless) → 수평 확장 용이 |
| 처리 방식 | 서버가 세션 ID로 사용자 상태 확인 | 서버가 JWT 자체를 검증해 사용자 확인 |
| 보안 | 세션 탈취 위험 | 토큰 탈취 시 유출 위험, 짧은 만료 시간으로 대응 가능 |
✔️ 즉, JWT는 서버가 상태를 저장하지 않기 때문에 확장성과 유지보수 측면에서 유리합니다. 클라우드 기반/ 마이크로서비스 환경에서 특히 강력한 인증 방식으로 주목받고 있습니다.
3️⃣ JWT의 구조
JWT는 세 부분으로 구성되어 있으며, 각 부분은 .으로 구분됩니다.
xxxxx.yyyyy.zzzzz
(header).(payload).(signature)
🔹 Header (헤더)
{
"alg": "HS256",
"typ": "JWT"
}
alg: 서명 알고리즘 (예: HMAC SHA256, RS256 등)typ: 토큰의 타입 (대부분 JWT)
🔹 Payload (페이로드)
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
- 사용자 정보 및 클레임(claims)을 담는 공간
- 기본 클레임:
iss(issuer),exp(만료 시간),sub(subject),iat(issued at) - 민감한 정보는 절대 포함 X (암호화되지 않음)
🔹 Signature (서명)
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
- 서버의 비밀 키 (secret) 를 이용 해 서명
- 토큰의 위변조 여부를 검증하는 용도
4️⃣ Base64 인코딩 방식
- JWT는 각각의 부분(header, payload, signature)을 Base64Url 인코딩합니다.
- 일반적인 Base64와 비슷하지만, URL에서 사용할 수 있도록 일부 문자를 수정한 버전
+→-,/→_, 패딩 문자=제거
📌 Base64는 단순한 인코딩이지 암호화가 아님 → 누구든 디코딩 가능
→ 중요한 정보는 절대 payload에 담지 말 것!