Skip to main content

Command Palette

Search for a command to run...

JWT 보안: 서명 검증부터 jti (JWT ID: JSON Token Identifier) 관리

Updated
3 min read

JWT(JSON Web Token)는 인증 시스템의 핵심 구성 요소로 널리 사용됩니다. 하지만 단순히 서명만 검증하고 사용하는 것만으로는 보안상 충분하지 않습니다. 이 글에서는 JWT 구조, 서명(Signature) 검증, jti (JWT ID) 검증, 실제 예시, Redis 연동, 그리고 클라이언트에서의 안전한 사용법까지 실전 위주로 모두 정리합니다.


1. JWT 구조 예시

JWT는 다음과 같이 3개의 파트로 구성된 문자열입니다:

<헤더>.<페이로드>.<서명>

예시 JWT 문자열

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiJ1c2VyMTIzIiwianRpIjoiYTIzNC1iNTY3LWQ4OWEtZmdoIiwiaWF0IjoxNzE2MjAwMDAsImV4cCI6MTcxNjIwMzYwMCwicm9sZSI6ImFkbWluIn0.
gnI4FbpyNdo7M43OsldBb4XZ9EMWHUuBh6ilAEM_0BE

Base64 디코딩 후 구성 요소

Header (헤더)

{
  "alg": "HS256",
  "typ": "JWT"
}
  • alg: 서명 알고리즘 (HMAC-SHA256)

  • typ: 토큰 타입 (JWT)

Payload (페이로드)

{
  "sub": "user123",
  "jti": "a234-b567-d89a-fgh",           // JWT ID (고유 식별자)
  "iat": 1716200000,                      // 발급 시각 (UNIX timestamp)
  "exp": 1716203600,                      // 만료 시각 (UNIX timestamp)
  "role": "admin"
}
  • sub: 사용자 식별자

  • jti: 고유 토큰 ID

  • iat: 발급 시각 (예: 2024-05-21 12:00:00)

  • exp: 만료 시각 (예: 2024-05-21 13:00:00)

  • role: 권한 정보

Signature (서명)

gnI4FbpyNdo7M43OsldBb4XZ9EMWHUuBh6ilAEM_0BE
  • 위 Header + Payload를 조합한 후 비밀 키로 HMAC-SHA256 서명한 결과

  • 토큰 위조 여부 검증에 사용


2. Signature vs jti: 왜 둘 다 필요한가?

✅ Signature 검증

  • 항상 수행

  • 토큰 위조 여부 확인

  • 비밀 키로 서버가 직접 서명 재생성 → 원본 서명과 비교

Claims claims = Jwts.parser()
  .setSigningKey("my-secret-key".getBytes())
  .parseClaimsJws(jwt)
  .getBody();

✅ jti (JWT ID: JSON Token Identifier) 검증

  • 토큰 자체의 고유 식별자

  • 블랙리스트, 로그아웃 처리, 재사용 탐지 등에 사용

  • 서버는 Redis/DB에서 jti 존재 여부나 상태를 별도로 확인함

String jti = claims.getId();
if (redis.exists("blacklist:" + jti)) {
  throw new TokenRevokedException();
}

3. Redis와 함께 jti 관리하기

예시: RefreshToken 발급 시

  • jti(UUID) 생성: a234-b567-d89a-fgh

  • Redis 저장

Key: refreshToken:a234-b567-d89a-fgh
Value:
{
  "userId": "user123",
  "ua": "Chrome/122",
  "ip": "192.168.0.1",
  "expiresAt": 1716800000
}
TTL: 7일

로그아웃 시 처리

  • 해당 jti를 블랙리스트로 이동

  • 이후 모든 요청에서 jti 확인 후 거부 처리


4. AccessToken vs RefreshToken 비교

항목AccessTokenRefreshToken
역할인증에 사용AccessToken 재발급에 사용
유효 시간짧음 (5~15분)김 (7~30일)
보관 위치클라이언트(메모리, 쿠키)서버(Redis/DB) 또는 HttpOnly 쿠키
jti 사용 여부선택 (로그아웃 블랙리스트 등)필수 (서버가 상태 관리)

5. 클라이언트에서 AccessToken 디코딩은 가능할까?

✅ 디코딩은 가능하지만, ❌ 신뢰해서 사용하면 안 됩니다.

안전한 사용 예

용도허용 여부이유
UI에 사용자명 표시사용자 경험 개선용
관리자 UI 숨김 처리단, 표시만 가능
관리자 API 접근 제어서버에서 role 검증 필수
userId로 API 호출위조 토큰일 수 있음

6. 최종 정리

검증 항목필수 여부설명
Signature✅ 필수위조 방지를 위해 서명 검증
jti⭕ 권장재사용 차단, 로그아웃, 토큰 무효화 등
  • 서명(Signature) 은 토큰이 변조되었는지 판단

  • jti (JWT ID) 는 토큰이 아직 유효한지, 서버가 허용하는지 판단

  • 보안은 두 단계 모두 필요합니다


마무리

JWT는 위조 방지를 위한 서명 검증(Signature)

상태 추적을 위한 토큰 식별자(jti)를 함께 활용할 때,

안정적이면서 보안성 높은 인증 시스템을 만들 수 있습니다.

서명은 위조를 막고, jti는 남용을 막는다.

More from this blog

Tech Lead의 기술 로드맵 작성법: 실전 예시와 함께

"우리 팀 기술 방향이 뭐예요?" Tech Lead가 되면 반드시 듣게 되는 질문입니다. 팀원들은 자신이 어디로 가고 있는지 알고 싶어합니다. 내년에도 이 기술을 쓸 건지, 새로운 걸 배워야 하는지, 이 프로젝트가 끝나면 뭘 하게 되는지. 기술 로드맵은 이 질문에 대한 답입니다. 단순히 "이런 기술 쓸 거예요"가 아니라, 왜 그 방향으로 가는지, 언제쯤 도달할 수 있는지, 각자 무엇을 준비해야 하는지를 보여주는 지도입니다. 이 글에서는 실제로 ...

Jan 10, 20266 min read

Tech Lead의 비용 관점: 돈을 아는 개발자가 되어야 하는 이유

Tech Lead는 단순히 "코드를 잘 짜는 시니어 개발자"가 아닙니다. 기술적 의사결정이 비즈니스에 미치는 영향을 이해하고, 비용 효율적인 선택을 할 수 있어야 합니다. 저는 직장을 다니면서 6년간 친구들과 창업을 준비했습니다. 자본이 넉넉하지 않았기에 모든 기술적 선택에서 "이게 정말 필요한가?", "더 저렴한 방법은 없는가?"를 고민할 수밖에 없었습니다. 그 경험이 지금의 비용 관점을 형성하는 데 큰 영향을 주었습니다. 이 글에서는 Tec...

Jan 10, 20265 min read

HTTP Toolkit으로 Spring Boot 애플리케이션 HTTP 요청 캡처하기

IntelliJ IDEA에서 HTTP Toolkit 프록시 설정하기 Spring Boot 애플리케이션을 개발할 때 외부 API 요청을 모니터링하고 디버깅하기 위해 HTTP Toolkit을 사용하는 경우가 많습니다. 이 글에서는 IntelliJ IDEA에서 HTTP Toolkit으로 프록시 설정하는 방법을 단계별로 설명하겠습니다. 1. HTTP Toolkit 설정 먼저 HTTP Toolkit을 실행하고 프록시 서버를 시작합니다. HTTP Too...

Jul 4, 20253 min read

인공지능 역사 인물 정리: 시대별 발전과 핵심 기여자

인공지능(Artificial Intelligence, AI)은 철학적 질문에서 시작해 알고리즘, 컴퓨팅 기술, 데이터의 발전을 거쳐 오늘날 생성형 AI로 진화했습니다. 이 글은 AI 역사 속 주요 인물을 시대별로 정리하고, 각 인물이 만들어낸 기술적 성과와 개념을 중심으로 소개합니다. 1950년대: 기계 지능 개념의 출발점 앨런 튜링 (Alan Turing, 1912–1954, 영국) 인공지능 개념의 철학적 기초 제시자 주요 이력 (19...

May 22, 20254 min read

📚 퀵소트 (QuickSort) : 원리, 방식 비교, 자바 구현까지

✨ 퀵소트란? 퀵소트(QuickSort)는 분할정복(Divide and Conquer) 전략을 활용한 정렬 알고리즘입니다. 피벗(Pivot)을 기준으로 배열을 분할하고, 각 부분 배열에 대해 재귀적으로 정렬을 수행하여 전체 정렬을 완성합니다. ⚙️ 작동 원리: 분할정복 퀵소트는 다음 세 단계로 구성됩니다. 단계설명 분할피벗을 기준으로 작은 값과 큰 값으로 배열을 나눈다 정복좌우 하위 배열에 대해 재귀적으로 퀵소트를 적용한다 결...

May 20, 20253 min read

Labaratory

19 posts