[Spring] Token

이연우·2025년 7월 28일

TIL

목록 보기
60/100

🔐 Token이란?

  • 인증(Authentication)인가(Authorization)를 위해 사용되는 디지털 문자열
  • 사용자의 신원과 권한을 증명하며, 요청의 유효성을 검증할 수 있게 해 줌

✅ Token을 사용하는 이유

이유설명
🧠 서버 부담 감소인증 상태 정보를 서버가 아닌 클라이언트에 저장
🌍 다양한 플랫폼 대응웹, 앱 등 다양한 환경에서 인증 처리 가능
🔁 Stateless 구조서버가 상태를 기억할 필요 없음 → 확장성↑
✍️ 서명(Signature) 포함위조 여부 검증 가능 (변조 방지)

🔁 Token 인증 동작 순서

  1. 사용자가 로그인 → 서버에서 Token 발급

  2. 클라이언트는 Token을 저장하고 요청 시마다 Header에 포함

  3. 서버는 Token의 유효성만 검사 → DB 접근 ❌

⚠️ Token의 단점

항목설명
📦 큰 용향Header + Payload + Signature → 쿠키/세션보다 큼
🔓 Payload는 암호화되지 않음Base64로 인코딩된 것일 뿐 → 누구나 디코딩 가능
🕵️ 탈취 시 치명적탈취당한 Token으로 누구나 인증 우회 가능
만료 시간 필요보안 강화를 위해 일반적으로 15~30분 설정

🪪 JWT(JSON Web Token)란?

  • 인증 정보를 JSON 형태로 담고, 이를 서명(Signature)하여
    안전하게 주고받을 수 있도록 만든 Token

✅ JWT의 구조

HEADER.PAYLOAD.SIGNATURE
xxxxx.yyyyy.zzzzz
구성 요소설명
📁 Header토큰의 타입(JWT)과 알고리즘(예: HS256)
📦 Payload인증 관련 정보(Claims)
🔏 Signature서버의 Secret Key로 서명하여 변조 여부 검증

1. Header 예시

{
  "alg": "HS256",
  "typ": "JWT"
}
  • alg: 해시 알고리즘 (예: HMAC SHA256)
  • typ: 토큰 타입 (JWT)

2. Payload 예시 (Claims)

{
  "sub": "1234567890",
  "name": "Sparta",
  "exp": 1682563600
}

> Claims의 종류

종류설명예시
🗂️ Registered Claims표준 정의된 값iss, exp, sub, iat, jti
🌐 Public Claims누구나 정의 가능예: name, email
🔒 Private Claims특정 시스템 간 정의된 값예: userRole, groupId

3. Signature 구성

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

→ 서명을 통해 변조 여부 검증
→ 서버가 가진 Secret Key로만 생성 가능

💡 추가 설명 팁

  • HeaderPayloadBase64Url 인코딩 → 복호화 가능
  • Signature복호화 불가, 서버의 Secret Key로만 검증 가능
  • 도구: 🔗 JWT.IO → 직접 확인 가능

🔄 Token vs Session 간략 비교

항목Token (JWT)Session
저장 위치클라이언트(로컬스토리지, 앱 등)서버(메모리, DB)
Stateless✅ (확장성↑)❌ (서버 상태 기억 필요)
복호화 가능성Payload만 가능없음
탈취 시 대처❗ 어려움 (만료 기다리거나 블랙리스트 관리 필요)세션 삭제로 즉시 무효화 가능
유효성 검사서명(Signature) 기반세션 ID 기반 (서버 조회)

🧠 요약 정리

항목내용
🔐 Token인증 정보를 담은 문자열, 클라이언트가 보관
💬 JWTJSON 형식 + 서명 포함된 Token
⚙️ 구조Header.Payload.Signature
✍️ 서명(Signature)변조 방지 기능 (서버만 생성 가능)
⏳ 보안 고려만료 시간 설정 필수, Payload에는 민감 정보 X
🔍 서버 확장성뛰어남 (Stateless 구조)

0개의 댓글