반응형
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는 기본적으로:
내용을 숨기는 암호화 토큰이 아니라,
내용이 위조되지 않았음을 보장하는 "서명된 토큰"
이다.
반응형
'system_fundamentals > security_cryptography' 카테고리의 다른 글
| 구글 로그인 기반 회원가입 시 DB구조 (0) | 2026.05.18 |
|---|---|
| OAuth2 흐름 (0) | 2026.05.18 |
| 세션 vs JWT (0) | 2026.05.18 |
| HTTPS 인증서는 웹사이트의 안전을 보장하는가 (0) | 2026.05.15 |
| HTTP vs HTTPS 실제 차이 (0) | 2026.05.15 |
댓글