구성 이유
추후 프로젝트에서 로그인 기능에서 적용하기 위하여 사전 공부
JWT 란?
Json Web Token 의 축약어로
Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token.
필요한 정보를 자체적으로 가지고있는 Self-Contained 방식으로 정보를 안정적으로 전달.
* RFC7519
JWT 사용 이유?
JWT는 주로 인증 과정에서 사용하게 되는데, 인터넷 환경에서 SWT(Simple Web Token)과 SAML(Security Assertion Markup Language Tokens) 보다 웹 환경에 적합하기 때문이다.
JSON은 XML보다 단순하기 때문에 용량이 작고 간편하다. 따라서 XML 기반의 SAML 보다 크기가 작다.
SWT은 대칭키 방식인 HMAC으로 해싱하지만 JWT, SAML은 x.509 인증서 형식의 공개키/개인키 방식으로 암호화하여 보안에 있어서 더 뛰어나다.
또한 JSON 데이터는 구조상으로 객체로 바로 변환될 수 있기 때문에 대부분 언어에서 지원. (XML은 객체로 매핑하는 과정이 어려움)
JWT 구조

JWT는 Header, Payload, Signature 세가지 영역으로 구분되어진다
Json으로 포맷된 각 부분은 Base64로 인코딩 되어 표현, 각 구분은 . 으로 구분
- Header(헤더)
헤더는 JWT의 암호화 방식과, 해싱 방식을 표기하는 정보를 담고있다.
alg : 해싱 알고리즘 서명(Signiture) 및 토큰 검증에 사용. (헤더를 암호화 하기위하여 사용되는것이 아닌, 서명을 암호화 하기 위함)
typ: 토큰의 타입
- Paylaod(페이로드)
토큰에서 사용할 정보의 조각들인 Claim(클레임)이 담겨있음.
클레임은 등록된 클레임(Registed), 공개된 클레임(Public), 비공개 클레임(Private) 으로 나눠지며, key-value 구조로 되어있다.
o 등록된 클레임
등록된 클레임은 토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터들로, 모두 선택적으로 작성이 가능하며 사용할 것을 권장한다.
- iss: 토큰 발급자(issuer)
- sub: 토큰 제목(subject), unique한 값을 사용한다. 주로 사용자 이메일 사용
- aud: 토큰 대상자(audience)
- exp: 토큰 만료 시간(expiration), NumericDate 형식으로 되어 있어야 함 ex) 1480849147370
- nbf: 토큰 활성 날짜(not before)
- at: 토큰 발급 시간(issued at), 토큰 발급 이후의 경과 시간
- jti: JWT 토큰 식별자(JWT ID), 중복 방지를 위해 사용하며, 일회용 토큰(Access Token) 등에 사용
o 공개 클레임
공개 클레임은 사용자 정의 클레임으로, 공개용 정보를 위해 사용된다. 충돌 방지를 위해 URI 포맷을 이용한다.
o 비공개 클레임
비공개 클레임은 사용자 정의 클레임으로, 서버와 클라이언트 사이에 임의로 지정한 정보를 저장한다.
- 서명 (Signiture)
토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다.
서명은 헤더와 페이로드, 그리고 비밀 키를 기반으로 생성되며 해당 토큰이 변조되지 않았음을 확인하기 위한 메커니즘이다.
[ 서명 생성 과정 ]
1. 헤더(Header)와 페이로드(Payload)의 값을 각각 BASE64로 인코딩
2. 인코딩한 값을 비밀 키를 이용해 헤더(Header)에서 정의한 알고리즘으로 해싱
3. 해싱한 값을 다시 BASE64로 인코딩하여 생성
JWT 암호화 방법
JWT를 생성할 때 헤더와 페이로드 정보를 인코딩하고, 이들을 합친 문자열에 대해 비밀 키로 서명을 생성
이때 대칭키(Symmetric Key) 또는 비대칭키(Asymmetric Key) 방식을 사용할 수 있다.
대칭키(Symmetric Key)
- 암호화 복호화 키가 같은 방식
- 같은 키를 사용해 암호화, 복호화를 수행하기 때문에 속도가 빠름
- 대표적으로 HMAC 암호화 알고리즘이 있음
- 값에 SHA-256을 적용해서 해싱 후 private key(== secret key, 대칭키 역할)로 암호화
- private key를 알고있는 서버만 Signature 유효성 검증이 가능(== JWT를 복호화 가능)
비대칭키(Asymmetric Key)
- 암호화 복호화 키가 다른 방식
- 다른 키를 사용해 암호화, 복호화를 수행하기 때문에 속도가 느리지만 그만큼 안전
- 대표적으로 RSA 암호화 알고리즘이 있음
- 마찬가지로 SHA-256 단방향 암호화 알고리즘과 함께 쓰임
- 값에 SHA-256를 적용해서 해싱후 private key(비밀키)로 암호화
- public key(공개키)는 공개적으로 제공. 어떠한 서버든 이 public key를 통해 JWT를 복호화 가능
JWT 장점 vs 단점
장점
1. auth0을 이용하면 아이디를 카카오, 네이버처럼 다른 사이트에서 이용할 수 있음
2. 서버측 부하를 낮출 수 있고 독립적이기 때문에 능률적으로 접근 권한 관리를 할 수 있고 분산/클라우드 기반 인프라 스트럭처에 잘 대응할 수 있음
3. 별도의 인증 저장소가 필요하지 않아서 인증서버와 db에 의존하지 않아도 됨
단점
1. 서버로부터 받은 토큰이 쿠키 또는 로컬스토리지, 세션스토리지에 저장이 되므로 탈취당할 위험이 있으므로 token에 중요 정보를 넣지 않아야 함
2. 토큰에 넣는 데이터가 많아질수록 토큰이 길어지는데 API를 호출할 때마다 토큰 데이터를 서버에 전달해야하므로 그만큼 네트워크 대역폭 낭비가 심할 수 있음
3. 한번 발급된 token은 수정, 폐기가 불가 ➡︎ Access token, Refresh token 사용
Refs
[Spring] JWT(Json Web Token)란? | 구조, 암호화 방법, 장단점
JWT (Json Web Token) : JWT(Json Web Token)란, JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web 토큰이다. JWT는 필요한 정보를 자체적으로 지니는 Self-Contained 방식으로 정보를 안정성 있
suddiyo.tistory.com
'BE > Java' 카테고리의 다른 글
| Springboot3 + Swagger + Jwt (2) (0) | 2024.06.20 |
|---|---|
| Springboot3 + Swagger + Jwt (1) (0) | 2024.06.20 |
| Scanner vs BufferReader (0) | 2024.06.03 |
| Stack 이란? (0) | 2024.02.13 |
| Queue 란? (0) | 2024.02.13 |