최근 웹개발에 있어 인증, 인가는 거의 JWT를 기반으로 이루어지는 것 같다.
이전에 Spring Security + JWT 도입을 통해 간단하게 사용하는 방법은 알아보았지만, JWT 그 자체에 대해서는 자세하게 적지 못한 것 같아. 이번에 조금 더 디테일하게 정리해보고자 한다.
JWT(JSON Web Token) 은 Json 형태의 인증 토큰으로, 웹 표준을 따르고 있기 때문에, 대부분의 언어에서 지원된다.
JWT는 https://jwt.io/ 에서 생성해볼 수 있다.
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
먼저 아래와 같이 값을 넣고 생성한다.
그 결과 아래와 같은 형태로 생성이 된다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6ImthZHVuIiwiaWF0IjoxNTE2MjM5MDIyfQ.YytZbYwKE2duBUV79ImIowK90KGcpqEJdw7Yrp4xo6o
토큰을 확인해보면, 콤마(.)를 기준으로 세 영역으로 구분되어 있음을 확인할 수 있다.
각 영역들은 Header(헤더), Payload(내용), Signature(서명) 으로 구분된다.
각 영역을 살펴보자
# Header
{
"alg": "HS256",
"typ": "JWT"
}
헤더에서는 해시 알고리즘과 토큰의 타입을 정의할 수 있다.
#Payload
{
"sub": "1234567890",
"name": "kadun",
"iat": 1516239022
}
내용에서는 Body 역할을 하는 내용들을 포함시킨다. 이러한 내용들을 "claim" 이라고 한다.
클레임은 3가지로 분류된다.
- registered claim
이미 이름이 정해져 있는 클레임이다. 주로 3자로 key 를 작성하는 규칙이 있다.- iss: 토큰 발급자 (issuer)
- sub: 토큰 제목 (subject)
- aud: 토큰 대상자 (audience)
- exp: 토큰의 만료시간 (expiraton)
- nbf: Not Before 를 의미하며, 토큰의 활성 날짜와 비슷한 개념
- iat: 토큰이 발급된 시간 (issued at), 이 값을 사용하여 토큰의 기간을 판단한다.
- jti: JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용
- public claim
공개 클레임은 사용자 마음대로 지정할 수는 있으나, 충돌 방지를 위해 이름을 URI 형식으로 짓는다. - private claim
주로 클라이언트와 서버 간에 사용되는 비공개 클레임이다. 충돌에 유의해야 한다.
마지막으로 서명 부분을 만드는 부분은 아래와 같다.
#signature
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
my-secret
)
이번 예제에서는 "my-secret" 이라는 문자열을 비밀키로 지정하고 base64로 인코딩 했다.
참고로 대부분의 언어에는 JWT를 직접 인코딩하거나 해싱하지 않아도 되도록, 적절한 라이브러리를 지원해주고 있다.
이전 포스팅에서 라이브러리의 사용법은 이미 작성해두었다.
참고
[JWT] JSON Web Token 소개 및 구조 | VELOPERT.LOG
지난 포스트에서는 토큰 기반 인증 시스템의 기본적인 개념에 대하여 알아보았습니다. 이 포스트를 읽기 전에, 토큰 기반 인증 시스템에 대해서 잘 모르시는 분들은 지난 포스트를 꼭 읽어주세
velopert.com
https://velog.io/@maintain0404/JWT%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
JWT에 대해 알아보자
Oauth에 많이 쓰이는 JWT에 대해 알아보자
velog.io
'개발 > Others' 카테고리의 다른 글
[NCP] Naver Cloud의 CDN 기능을 사용해보자 (1) | 2024.03.03 |
---|---|
[NCP] S3 SDK를 Naver 클라우드에서 사용해보자 (0) | 2024.02.25 |
[ELK] 마치 SQL처럼 사용하자 (0) | 2023.09.10 |
[ELK] 시작한 김에 ELK(2) (0) | 2023.09.02 |
[ELK] 시작한 김에 ELK(1) (0) | 2023.08.27 |