25.01.23 TIL JWT

신성훈·2025년 1월 23일
0

TIL

목록 보기
125/162

1. JWT(JSON Web Token)란?

JWT(JSON Web Token)JSON 기반의 데이터를 암호화하여 토큰 형식으로 전달하는 방식입니다.
주로 사용자 인증정보 교환을 위해 사용되며 Stateless 환경에서 세션을 대체할 수 있는 방식으로 활용됩니다.

JWT는 다음과 같은 구조로 구성:
1. Header: 토큰의 타입과 알고리즘 정보
2. Payload: 인증 정보나 데이터를 포함
3. Signature: 토큰의 유효성을 확인하기 위한 서명

JWT 구조 예시

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

2. JWT의 구성

  1. Header

    • 토큰의 타입과 서명 알고리즘 정보를 포함
    {
        "alg": "HS256",
        "typ": "JWT"
    }
  2. Payload

    • 사용자의 정보와 Claim(속성)을 포함
    • 예: 사용자 ID, 권한(Role) 등등
    • Claim 예시:
      • Registered: iss(발급자), exp(만료 시간) 등등
      • Public: 사용자 정의 값
    {
        "sub": "1234567890",
        "name": "John Doe",
        "admin": true
    }
  3. Signature

    • Header와 Payload를 합친 뒤 비밀 키를 사용해 생성
    • 데이터 위변조를 방지
    HMACSHA256(
        base64UrlEncode(header) + "." +
        base64UrlEncode(payload),
        secret
    )

3. JWT의 특징

  1. Self-contained

    • 필요한 정보를 자체적으로 포함하여 추가적인 데이터베이스 조회 없이 인증 가능
  2. Stateless

    • 서버에서 상태 정보를 유지하지 않아 확장성 높은 시스템 설계 가능
  3. Base64 인코딩

    • JWT는 Base64로 인코딩되어 URL-safe하며, 쉽게 디코딩 가능
    • 민감한 정보는 포함하면 안 됨
  4. 서명(Signature)

    • 데이터 위변조를 방지하지만 암호화는 아님(데이터가 노출될 수 있음)

4. JWT의 장점과 단점

장점

  1. 확장성: Stateless 방식으로 서버 부하 감소
  2. 보편성: 다양한 언어와 플랫폼에서 사용 가능
  3. 사용 편의성: 클라이언트와 서버 간 쉽게 전달 및 검증 가능

단점

  1. 데이터 크기: 모든 데이터를 토큰에 포함하면 크기가 커질 수 있음
  2. 보안 문제: 비밀 키 유출 시 심각한 보안 문제가 발생
  3. 만료 처리 어려움: 한 번 발급된 토큰은 취소가 어려워 만료 시간 관리를 신중히 해야 함

5. JWT 사용 예시 (Spring Security 기반)

JWT 발급 예제

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JwtProvider {
    private final String secretKey = "mySecretKey";
    private final long validityInMilliseconds = 3600000; // 1시간

    public String createToken(String username) {
        return Jwts.builder()
                .setSubject(username) // 사용자 정보
                .setIssuedAt(new Date()) // 발급 시간
                .setExpiration(new Date(System.currentTimeMillis() + validityInMilliseconds)) // 만료 시간
                .signWith(SignatureAlgorithm.HS256, secretKey) // 서명
                .compact();
    }
}

JWT 검증 예제

public boolean validateToken(String token) {
    try {
        Jwts.parser()
            .setSigningKey(secretKey)
            .parseClaimsJws(token);
        return true;
    } catch (Exception e) {
        return false;
    }
}

6. JWT의 활용 사례

  1. 사용자 인증

    • 로그인 시 JWT 발급 → 클라이언트가 요청마다 헤더에 JWT 포함 → 서버가 토큰 검증 후 응답
  2. 정보 교환

    • 시스템 간 데이터를 안전하게 교환
  3. API 인증

    • RESTful API 호출 시 클라이언트의 인증을 위한 토큰 사용

7. 마무리

JWT는 서버 확장성과 편의성을 높이는 데 매우 유용한 인증 방식입니다. Spring Security에서 JWT를 구현하며 인증 프로세스를 효율적으로 처리하는 경험을 할 수 있었습니다.
하지만 JWT는 민감한 정보를 직접 포함하면 안 되며 만료 처리와 비밀 키 관리를 철저히 해야 한다는 점을 배웠습니다.
프로젝트 상황에 따라 JWT를 세션과 혼합하거나 OAuth2와 연계하는 등 다양한 인증 전략을 설계하는 것이 중요하다는 것을 느꼈습니다.

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글