CS

JWT (JSON Web Token)

baek-dev 2025. 1. 14. 19:03

JSON 형식의 데이터를 사용하여 정보를 안전하게 전달하기 위한 토큰 기반 인증 방식

암호화를 통해 데이터의 무결성과 신뢰성을 보장하며, 주로 인증과 권한 부여에 사용된다

 

구성

세부분으로 구성되며, 각 부분은 . 으로 구분된다

Header.Payload.Signature

 

1. Header

  • 토큰의 타입(JWT)과 암호화 알고리즘 정보를 포함
{
  "alg": "HS256", // HMAC SHA-256 알고리즘
  "typ": "JWT"   // 토큰 타입
}

 

2. Payload

  • 실제 전달하고자 하는 데이터(클레임)를 포함
  • 클레임(Claims)은 키-값 쌍으로 이루어진 데이터로, 사용자 정보나 토큰 관련 정보를 저장
  • 클레임 종류
    • Registered Claims : 토큰에 미리 정의된 표준 정보 (예 : iss, exp, sub 등)
    • Public Claims : 공개적으로 정의된 사용자 정보
    • Private Claims : 서버와 클라이언트 간에만 공유되는 비공개 정보
{
  "sub": "1234567890", // 사용자 ID
  "name": "John Doe", // 사용자 이름
  "admin": true,      // 권한 정보
  "iat": 1516239022   // 발행 시간 (Unix 타임스탬프)
}

 

3. Signature

  • 헤더와 페이로드를 조합한 후 비밀 키를 사용해 생성된 암호화 서명
  • 서명은 토큰이 위조되지 않았음을 보장한다
  • 생성 방법 :
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secretKey
)

동작 방식

1. 사용자 인증

  • 사용자가 사용자 이름과 비밀번호를 입력하면 서버에서 이를 검증한다

2. JWT 발급

  • 검증에 성공하면 서버는 JWT를 생성하여 클라이언트에 전달한다

3. JWT 포함 요청

  • 클라이언트는 이후 요청에서 JWT를 Authorization 헤더에 포함하여 서버로 전송한다
Authorization: Bearer <JWT>

 

4. JWT 검증

  • 서버는 JWT의 서명을 확인하여 무결성을 검증하고, 페이로드의 정보를 기반으로 요청을 처리한다

장점

1. Stateless (상태 비저장)

  • 서버가 세션 정보를 유지할 필요가 없다. 모든 인증 정보는 토큰 자체에 포함된다

2. 확장성

  • 서버 간 정보를 공유할 필요 없이 JWT만으로 인증을 처리할 수 있어 분산 시스템에 적합하다

3. 빠른 인증

  • 요청마다 데이터베이스 조회 없이 토큰의 유효성만 확인하면 된다

4. 다양한 플랫폼 지원

  • 웹, 모바일, 데스크톱 애플리케이션 모두에서 사용 가능하다

 

단점

1. 크기 문제

  • JWT는 JSON 데이터를 포함하므로, 일반적인 세션 ID보다 크기가 크다. 네트워크 트래픽에 영향을 줄 수 있다

2. 토큰 무효화 어려움

  • 발급된 JWT는 만료시간 전까지 유효하므로, 토큰을 즉시 무효화하는데 어려움
  • 이를 해결하기 위해 블랙리스트나 짧은 만료시간 + 리프레시 토큰 전략을 사용한다

3. 보안

  • 비밀 키가 유출되면 토큰 위조 위험이 있다
  • HTTPS를 반드시 사용해야 한다

사용 사례

1. 사용자 인증

  • 로그인 후 JWT를 발급받아 클라이언트가 이후 요청마다 인증 정보를 전달

2. 권한 부여

  • 페이로드에 사용자 권한 정보를 포함하여 API 접근 제어

3. 마이크로서비스 통신

  • 마이크로서비스 간 인증 및 데이터 전송

4. OAuth 2.0

  • 액세스 토큰으로 JWT를 활용

보안 모범 사례

1. 비밀 키 보호

  • 서명에 사용되는 비밀 키를 안전하게 관리해야 한다

2. HTTPS 사용

  • 네트워크에서 토큰이 탈취되지 않도록 요청과 응답을 암호화

3. 만료 시간 설정

  • 짧은 만료 시간을 설정하여 토큰이 유출되더라도 악용 기간을 줄임

4. 리프레시 토큰 사용

  • 액세스 토큰이 만료되면 리프레시 토큰을 통해 새 액세스 토큰을 발급

5. 토큰 서명 알고리즘

  • 강력한 암호화 알고리즘 (예 : HS256, RS256)을 사용

예제

JWT 구조

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

 

1. Header :

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

 

2. Payload :

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

 

3. Signature :

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

요약

  • JWT (JSON Web Token)는 클라이언트-서버 간 인증 및 데이터 전달을 위한 토큰
  • 구성 : Header, Payload, Signature
  • 장점 : 상태 비저장, 확장성, 빠른 인증
  • 단점 : 크기 문제, 즉시 무효화 어려움
  • 보안을 위해 HTTPS 사용, 짧은 만료 시간 설정, 리프레시 토큰 사용 등이 필요

 

 

 

 

출처 : ChatGPT

'CS' 카테고리의 다른 글

CSRF  (0) 2025.01.19
HTTP, HTTPS  (0) 2025.01.15
API Key  (0) 2025.01.13
Bearer Token  (0) 2025.01.12
URI , URL  (0) 2025.01.11