2022. 1. 29. 00:15ㆍetc
오늘은 JWT 라는 녀석을 알아 보려고 한다.
HTTP 통신은 비연결성 (Connectionless), 무상태성(Stateless) 이라는 특징을 가지고 있기에 통신의 상태는 저장되지 않는다.
그럼 생각을 해보자.
메일을 예로 들자면..
네이버 메일을 확인하기 위해 로그인을 하여 메일 리스트가 노출된다.
메일 리스트 중 내가 원하는 메일을 클릭하면 서버는 내 요청이 누가 보낸 요청인지 알수없다.
그렇다면 다시 로그인을 해야하고, 매번 새로운 요청에 로그인이 필요한 요청일때마다 로그인을 해야하는
번거롭고 끔찍한 일이 발생한다.
이러한 문제를 해결하기 위해 대표적인 Session, Token 이 존재한다.
그렇다면 세션 과 토큰을 접목하여 다시 얘기해보겠다.
네이버 메일로 접속하여 로그인을 한다.(요청)
서버는 해당 유저의 아이디, 패스워드를 확인 후 일치 한다면 세션, 토큰을 발급한다.
여기서 두 인증 방식의 차이점이 발생한다.
세션방식의 인증은 세션을 발급하고 서버에 저장된다.
토큰방식의 인증은 발급하고 나서 응답을 통해 클라이언트 에게 전달 후
클라이언트에 저장된다.
이 두개의 인증 방식을 통해 통신의 상태를 저장할수 있다.
이제 JWT를 더 자세하게 알아보자
JWT(Json Web Token)
JWT(Json Web Token)은 토큰 기반인증 으로 암호화 된 토큰을 의미 한다. JWT의 구조는 Header, Payload, Signature 로 이루어져 있으며 각 부분을 Base64로 인코딩하고 마침표로 구분을 하여 이어주면 JWT가 완성된다.
위 사진을 보면 빨간 부분이 Header 보라색 부분이 Payload 하늘색 부분이 Signature 이다.
구조에 대해서 좀 더 자세히 알아보자.
JWT 구조
Header
Header 의 형태는 두 가지로 alg, typ 가 있다.
- alg : Algorithm 의 약자로 암호화에 사용할 알고리즘을 선택한다.
- typ : type 의 약자로 JWT 토큰의 타입을 정의한다. (JWT는 JWT 고정)
Payload
Payload 에는 토큰에 담을 정보가 담겨져 있다. 담는 정보들을 클레임(Claim) 이라고 부르며 name/value 형태를 가지고 있다.
클레임의 종류는 총 세가지로 등록된 클레임(Registed Claim), 공개 클레임(Public Claim), 비공개 클레임(Private Claim)이
존재한다.
1. 등록된 클레임(Registed Claim)
등록된 클레임은 서비스에서 필요한 정보가 아닌 토큰에 관한 정보들을 위한 클레임들이며 해당 클레임의 사용은 선택이다.
등록된 클레임의 종류는 아래와 같다.
- iss(issuer) : 토큰 발급자
- exp(expiration time) : 토큰 만료 시간
- sub(subject) : 토큰 제목
- aud(audience) : 토큰 수신자/대상자
- nbf(Not Before) : 토큰의 활성 날짜
- iat(issued at): 토큰이 발급된 시간, 토큰의 age가 얼마나 되었는지 판단 가능
- jti : JWT의 고유 식별자, 주로 중복 처리 방지를 위해 사용 하며 일회용 토큰에 사용하면 유용 하다고 한다.
2. 공개 클레임(Public Claim)
공개 클레임은 충돌이 방지된 이름을 가지고 있어야 하며 충돌을 방지하기 위해 클레임 이름을 URI 형태로 지정한다.
ex)
{
"https://xxx.com/xxx/xx" : true
}
3. 비공개 클레임(Private Claim)
비공개 클레임은 클라이언트 와 서버에 합의하에 사용되는 클레임을 정의하며 이름이 중복되는것을 주의 해야 한다.
ex)
{
"name" : "John Doe"
}
Signature
Signature 는 토큰을 인코딩, 유효성 검증에 사용하는 암호화 코드이다.
Signature의 구성을 위 이미지를 예시로 들어보자.
위 이미지를 보면
base64UrlEncode(header) + base64UrlEncode(payload), your-256-bit-secret 로 구성이 되어 있다.
또한 HMACSHA256은 header에서 정의한 alg 값을 뜻한다.
즉, header의 값 , payload 의 값을 base64로 인코딩 한 후 그 값을 비밀키(위 이미지 에서는 your-256-bit-secret) 를
통해 header에서 정의한 알고리즘으로 해싱을 하고 최종적으로 값을 다시 base64로 인코딩하여 생성한다.
'etc' 카테고리의 다른 글
[ETC] Web Server & WAS(Web Application Server (1) | 2022.01.25 |
---|---|
[ETC] 동기(Sync)/비동기(Async), 블로킹(Blocking)/논블로킹(Non-Blocking) (0) | 2022.01.21 |