JWT (JSON Web Token)

FeelsBotMan·2025년 3월 7일

JWT

목록 보기
1/5
post-thumbnail

JWT는 JSON 포맷으로 정보를 안전하게 표현하기 위해 사용되는 토큰 기반 인증 메커니즘이다. 서버는 클라이언트의 상태를 기억하지 않고, 토큰만 검증해서 인증 여부를 판단 후 토큰 안에 담긴 정보를 읽고 처리한다. 발급 이후 토큰 내용은 변경할 수 없다.

JWT의 장점

  • 자체 포함(Self-contained): 모든 정보가 토큰에 포함되어 별도의 데이터베이스 조회가 필요 없는 경우도 있음.
  • 가볍고 빠름: 단순한 문자열 기반 토큰으로, 빠르게 생성/검증 가능.
  • 확장성: JSON 형식이므로 다른 시스템과 통합이 용이.
  • Cross-domain 지원: 상태를 서버에 유지하지 않으므로 분산 시스템에서 유용.

JWT의 단점

  • 토큰 크기: 토큰 크기가 비교적 크기 때문에 빈번한 요청에 부담이 될 수 있음.
  • 토큰 만료: 한 번 발급된 토큰은 만료 전까지는 서버에서 무효화하기 어려움(리프레시 토큰 사용으로 해결 가능).
  • 보안 문제: 민감한 데이터를 페이로드에 포함하면 안 됨(평문으로 해독 가능). XSS 공격에 취약할 수 있음(브라우저에 저장된 경우).

JWT는 세 부분으로 나누어지며, 각 부분은 .으로 구분된다.

<Header>.<Payload>.<Signature>

Header (헤더)

  • JWT의 타입과 암호화 알고리즘 정보를 담고 있다.
  • 보통 아래와 같은 JSON형식이며, Base64Url로 인코딩된다.
{
  "alg": "HS256", // 해싱 알고리즘 (예: HMAC SHA-256)
  "typ": "JWT"    // 토큰 타입
}

Payload (페이로드)

  • 토큰에 포함된 데이터(Claims)가 들어 있는 부분이다.
  • 일반적으로 사용자 정보와 같은 데이터가 포함된다.
  • 페이로드도 Base64Url로 인코딩된다. 즉, Base64Url로 디코딩하면, JSON 형태로 사용자 정보나 기타 클레임을 확인할 수 있다.
  • Claims 종류
    • 등록된(Registered) Claims: 표준화된 클레임(필수 아님). 예: iss(발급자), exp(만료 시간), sub(주제), aud(대상).
    • 공개(Public) Claims: 사용자 정의 가능. 예: userId, role.
    • 비공개(Private) Claims: 클라이언트와 서버 간 약속된 데이터.
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "exp": 1712179200 // 만료 시간 (Unix Timestamp)
}

Signature (서명)

  • 토큰의 무결성을 보장하기 위해 사용(서명을 통해 토큰이 위조되지 않았음을 확인할 수 있다).
  • 헤더와 페이로드를 조합하여 생성:
  • 서명 변조가 불가능한 이유
    • 비밀 키(Secret Key) 관리: 서버에서만 비밀 키를 알고 있으며, 이를 노출하지 않는 한 서명을 위조할 수 없다.
    • 강력한 암호화 알고리즘: HMAC-SHA256, RS256 등 강력한 해싱 및 암호화 알고리즘을 사용. 키를 알지 못하면 서명 결과를 맞추는 것은 거의 불가능하다.
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload), 
  secretKey
)

서명이 위조되지 않는다고 해서 JWT 자체가 항상 안전한 것은 아니다. 몇 가지 주의사항을 지켜야 한다

  • HttpOnly 쿠키 사용: JavaScript에서 접근 불가
  • HTTPS 사용: 네트워크에서 탈취 방지
  • 서버는 알고리즘을 명시적으로 지정하고, none을 허용하지 않아야 함: 공격자가 Header의 알고리즘을 none으로 바꿔서 검증을 우회하려는 시도가 있을 수 있음
  • 서명 키 관리: 비밀 키(secret)를 안전하게 저장하고 정기적으로 교체.
  • 짧은 만료 시간 설정: exp를 짧게 설정하고, 리프레시 토큰을 사용. 서버 측에서 "블랙리스트"를 사용하여 강제 로그아웃 처리.
  • Scope 및 Audience 제한: JWT를 특정 리소스나 용도로만 제한. Payload는 인코딩(Base64Url)만 되어 있고 암호화되지 않으므로 민감한 정보는 JWT에 포함하지 말 것.
profile
안드로이드 페페

0개의 댓글