1. JWT란

JWT(JSON Web Token)는 인증 정보를 담은 토큰입니다. 로그인에 성공하면 서버가 JWT를 발급하고, 이후 클라이언트는 매 요청마다 이 토큰을 보내서 "나 로그인한 사람이야"를 증명합니다.

JWT의 구조

JWT는 3개의 부분으로 구성되어 있고, 점(.)으로 구분됩니다:

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJobdksDAsImV4cCI6MTcwOTY1ODAwM.abc123signatureeee
├── Header ─────────┤├── Payload ────────────────────────────┤├── Signature ─────┤

Header: 토큰 타입(JWT)과 해싱 알고리즘(HS256 등)

{
    "alg": "HS256",
    "typ": "JWT"
}

Payload: 실제 데이터. 사용자 정보, 만료 시간 등

{
    "sub": "hong",
    "role": "USER",
    "iat": 1709654400,
    "exp": 1709658000
}

Signature: Header + Payload를 비밀키로 서명한 값. 토큰이 위변조되지 않았음을 검증

인증 흐름

1. [클라이언트] POST /api/auth/login  { username, password }
2. [서버] 비밀번호 확인 → JWT 토큰 생성 → 응답으로 전달
3. [클라이언트] 토큰을 저장 (localStorage 등)
4. [클라이언트] 이후 모든 요청에 헤더로 토큰 첨부
   Authorization: Bearer eyJhbG...
5. [서버] 토큰 검증 → 유효하면 요청 처리

세션 방식과의 차이

세션 방식:
- 서버가 로그인 상태를 메모리에 저장
- 서버가 여러 대면 세션 동기화 필요
- 서버 재시작 시 세션 소실

JWT 방식:
- 서버가 상태를 저장하지 않음 (Stateless)
- 토큰 자체에 정보가 담겨있음
- 서버 확장이 쉬움
- REST API에 적합

2. JWT 의존성 추가