정의

JSON Web Token의 약자로 전자서명 된 URL-safe의 JSON입니다.

전자서명은 JSON의 변조를 체크를 할 수 있다.

 

표준

JWT의 표준은 JWS와 JWE가 있다

 

JWS (JSON Web Signature)은 간단히 말하면 “JSON으로 전자 서명을하여 URL-safe 문자열로 표현한 것”입니다.

JWE (JSON Web Encryption)는 “JSON을 암호화하여 URL-safe 문자열로 표현한 것” 입니다.
서명은 서명 할 때 사용한 키를 사용하여 JSON이 손상되지 않았는지 확인 할 수 있도록하는 것입니다. 
URL Safe는 말 그대로 URL에 포함 할 수없는 문자를 포함하지 않는 것입니다.

 

구성 

JWT는 세파트로 나누어지며, 각파트는 점으로 구분하고 xxxxx.yyyyy.zzzzz로 표현된다.

순서대로 헤더(Header) + 페이로트 (Payload) + 서명 (Signature)

Base64url인코딩을 사용한다.

 

Header는 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있습니다. 첫째는 토큰의 유형 (JWT)을 나타내고, 두 번째는 HMAC, SHA256 또는 RSA와 같은 해시 알고리즘을 나타내는 부분입니다.

{
    "alg": "ES256",
    "kid": "Key ID"
}


Payload는 토큰에 담을 클레임(claim) 정보를 포함하고 있습니다. Payload 에 담는 정보의 한 ‘조각’ 을 클레임이라고 부르고, 이는 name / value 의 한 쌍으로 이뤄져있습니다. 토큰에는 여러개의 클레임 들을 넣을 수 있습니다.
클레임의 정보는 등록된 (registered) 클레임, 공개 (public) 클레임, 비공개 (private) 클레임으로 세 종류가 있습니다.

{
    "iss": "jinho.shin",
    "iat": "1586364327"
}


마지막으로 Signature는 secret key를 포함하여 암호화되어 있습니다.

 

결과

eyJhbGciOiJFUzI1NiIsImtpZCI6IktleSBJRCJ9.eyJpYXQiOjE1ODYzNjQzMjcsImlzcyI6ImppbmhvLn
NoaW4ifQ.eyJhbGciOiJFUzI1NiIsImtpZCI6IktleSBJRC9.eyJpYXQiOjE1ODYzNjQzMjcsImlzcyI6Imp
pbmhvLnNoaW4ifQ.MEQCIBSOVBBsCeZ_8vHulOvspJVFU3GADhyCHyzMiBFVyS3qAiB7Tm_ME
Xi2kLusOBpanIrcs2NVq24uuVDgH71M_fIQGg

 

기존방식과 비교

 

기존방식은 토큰은 이후의 모든 서비스 호출에 사용됨.

서비스를 받기 위해서는 토큰의 유효성을 확인하여 세부정보를 쿼리해야함

참조에 의한 호출 형태의 모든 서비스는 항상 상호작용할 때 다시 접속해야됨

 

JWT를 사용하면, 토큰이 필요한 모든 정보를 포함하고 있어 참조가 필요없기 때문에 마이크로서비스 자체에서 유효성을 검증함

 

프로세스

1. 사용자가 id와 password를 입력하여 로그인을 시도합니다.

2. 서버는 요청을 확인하고 secret key를 통해 Access token을 발급합니다.

3. JWT 토큰을 클라이언트에 전달 합니다.

4. 클라이언트에서 API 을 요청할때  클라이언트가 Authorization header에 Access token을 담아서 보냅니다.

5. 서버는 JWT Signature를 체크하고 Payload로부터 사용자 정보를 확인해 데이터를 반환합니다.

6. 클라이언트의 로그인 정보를 서버 메모리에 저장하지 않기 때문에 토큰기반 인증 메커니즘을 제공합니다.

 

사용처

  • 회원 인증: JWT 를 사용하는 가장 흔한 시나리오 입니다. 사용자가 로그인을 하면, 서버는 사용자의 정보를 기반으로한 토큰을 발급합니다.
    그 후, 사용자가 서버에 요청을 할 때 마다 JWT를 포함하여 전달합니다. 서버는 클라이언트에서 요청을 받을때 마다, 해당 토큰이 유효하고 인증됐는지 검증을 하고, 사용자가 요청한 작업에 권한이 있는지 확인하여 작업을 처리합니다.
    서버에서는 사용자에 대한 세션을 유지 할 필요가 없습니다. 즉 사용자가 로그인되어있는지 안되어있는지 신경 쓸 필요가 없고, 사용자가 요청을 했을때 토큰만 확인하면 되므로 세션 관리가 필요 없어서 서버 자원과 비용을 절감할 수 있습니다.

 

  • 정보 교류: JWT는 두 개체 사이에서 안정성있게 정보를 교환하기에 좋은 방법입니다. 그 이유는, 정보가 서명이 되어있기 때문에 정보를 보낸이가 바뀌진 않았는지, 또 정보가 도중에 조작되지는 않았는지 검증할 수 있습니다.

참조 : 

http://www.opennaru.com/opennaru-blog/jwt-json-web-token/

https://meetup.toast.com/posts/239

 

 

 

+ Recent posts