본문 바로가기
system_fundamentals/security_cryptography

JWT는 암호화가 아니다

by 죄니안죄니 2026. 5. 18.
반응형

JWT(JSON Web Token)는 기본적으로:

암호화(encryption)가 아니라
서명(signature)
 

이다.

즉:

"위조 방지"
 

가 목적이지,

"내용 숨기기"
 

가 목적이 아니다.


JWT 구조 먼저

JWT는 보통 이렇게 생김.

HEADER.PAYLOAD.SIGNATURE
 

예:

eyJ...
eyJ...
abc...
 

실제 Payload는 그냥 JSON

예:

 
{
  "userId":"hoon",
  "role":"ADMIN",
  "exp":9999999999
}
 

이게 Base64Url 인코딩될 뿐

즉:

읽기 어렵게 보이기만 할 뿐
 

이다.


Base64는 암호화가 아님

엄청 중요.

Base64는 그냥:

문자 표현 변환
 

이다.

즉 누구나 다시 디코딩 가능.


실제로 JWT는 쉽게 읽힘

JWT 사이트 같은 곳에 붙여넣으면:

  • Header
  • Payload

바로 보인다.


그래서 절대 넣으면 안 되는 것

JWT Payload에:

  • 비밀번호
  • 주민번호
  • 카드번호
  • 민감 개인정보

넣으면 안 된다.


JWT의 핵심은 Signature

중요한 건 마지막 부분.

SIGNATURE
 

서버가 서명 생성

예(HMAC):

HMAC(secret,header.payload)


의미

"이 Payload는 서버가 만든 것"
 

증명.


그래서 가능한 것

누군가 Payload를:

 
{
  "role":"ADMIN"
}
 

로 바꾸면?


Signature 불일치 발생

즉:

위조 검출
 

가능.


즉 JWT 핵심은

기능 제공 여부
위조 방지 O
무결성 O
암호화 기본 X

그래서 JWT는 "신분증" 느낌

예:

내용은 보이지만,
위조는 어려움
 

운전면허증 비유

  • 이름 보임
  • 생년월일 보임

하지만:

위조 여부는 검증 가능
 

한 느낌.


그럼 암호화 JWT는 없나?

있다.


JWS vs JWE

JWT 계열에는 2가지 존재.

종류 의미
JWS 서명 JWT (대부분 사용)
JWE 암호화 JWT

실무 대부분은 JWS

즉:

읽기는 가능
위조만 방지
 

구조.


JWE는?

Payload 자체를 암호화.

즉:

내용 숨김 가능
 

그런데 왜 잘 안 쓰냐?

복잡하고 무겁다.

보통 HTTPS 자체가 이미 암호화라서:

굳이 JWT까지 암호화 안 하는 경우 많음
 

그래서 실무 원칙

JWT에는:

"노출돼도 큰 문제 없는 최소 정보"
 

만 넣는다.


보통 넣는 것

예:

 
{
  "sub":"123",
  "role":"ADMIN",
  "exp":999999
}
 

중요한 보안 포인트

HTTPS 없으면 JWT도 위험.

왜냐면 JWT는:

Bearer Token
 

이기 때문.


Bearer 의미

"가진 사람이 사용자"
 

라는 뜻.

즉 탈취되면 끝.


그래서 HTTPS 필수

HTTPS로:

  • JWT 탈취 방지
  • 세션 하이재킹 방지

해야 한다.


실무에서 자주 하는 실수

1. 민감정보 저장

절대 금지.

2. 너무 긴 만료시간

탈취 위험 증가.

3. LocalStorage 저장

XSS에 취약 가능.

최근은:

HttpOnly Secure Cookie
 

많이 사용.


핵심 한 줄

JWT는 기본적으로:

내용을 숨기는 암호화 토큰이 아니라,
내용이 위조되지 않았음을 보장하는 "서명된 토큰"
 

이다.

반응형

댓글