Json Web Token(JWT)
Json Web Token 이란?
Json Web Token
은 정보를 안전하게 전달하기 위한 웹표준(RFC 7519)입니다.JWT
는 Json
객체를 사용하여 자가 수용적(Self-contained)인 방법으로 정보를 전달합니다. JWT
는 디지털 서명이 되어있어 데이터의 신뢰성을 보장합니다. JWT
는 HMAC 알고리즘을 사용하거나, RSA 혹은 ECDSA 를 통한 공개/비공개 키 쌍을 사용해 서명 할 수 있습니다.
JWT의 사용
- Authorization:
JWT
를 사용하는 가장 일반적인 시나리오입니다. 사용자가 로그인 한 후의 각 요청은JWT
가 포함되어 사용자는JWT
를 통해 허용되는 경로, 서비스, 리소스에 액세스 할 수 있습니다. - Information Exchange:
JWT
는 당사자간 정보를 안전하게 전송할 수 있습니다. token에 서명이 되어 있기 때문에, 정보를 보낸 이가 바뀌진 않았는지,header
와payload
를 통해 정보가 변조되지 않았는지 확인이 가능합니다.
JWT의 구조
JWT
는 .
구분자를 사용해 다음의 3가지 영역으로 나뉘어집니다.
- Header
- Payload
- Signatue
각각의 문자열이 어떤 역할을 하는지 알아보겠습니다.
header
header
는 두 가지 요소로 구성됩니다. 바로 alg
와 typ
인데요. typ
은 token의 종류를, alg
는 서명에 사용된 알고리즘을 지정합니다. 서명에 사용되는 알고리즘은 일반적으로 HMAC 알고리즘과 RSA 알고리즘이 사용됩니다.
아래는 JWT
의 header
예시입니다.
{
"alg": "HS256",
"typ": "JWT"
}
이 JSON은 Base64Url로 인코딩되어, JWT
의 첫 부분을 형성합니다.
payload
JWT
의 두번째 파트인 payload
에는 토큰에 담을 정보가 들어있습니다. payload에 담기는 정보들을 클레임(Claims) 이라고 부릅니다. 클레임은 name / value 의 한 쌍으로 이루어져 있습니다. 클레임은 다음 3가지 분류로 나뉘어집니다.
- Registered claims
- 미리 정의 된 클레임의 집합입니다. Registered claims는 서비스와 관련된 정보가 아닌,
JWT
에 관련된 내용을 담습니다. Registered claims를 사용하는 것은 자유지만, 권장하고 있습니다. 대표적인 Registered claims는 아래와 같습니다.iss(Issuer)
: 토큰 발급자에 대한 정보를 담습니다.sub(Subject)
: 토큰 제목을 기록합니다.aud(Audience)
: 토큰을 받을 대상자에 대한 정보를 담습니다.exp(Expiration Time)
: 토큰의 만료시간을 저장합니다.nbf(Not Before)
: 토큰의 활성날짜를 의미합니다.nbf
에 기재된 시간 이전에는 토큰을 사용할 수 없습니다.iat(Issued At)
: 토큰의 발행날짜를 의미합니다.jti(JWT ID)
: 토큰의 고유 아이디를 의미합니다. 주로 토큰의 중복방지를 위해 사용됩니다.
- 미리 정의 된 클레임의 집합입니다. Registered claims는 서비스와 관련된 정보가 아닌,
- public claims
- Public Claims는 사용자 정의 클레임입니다. 공개용 정보를 위해 사용되며, 클레임의 충돌을 피하기 위해 IANA JSON Web Token Registry 에 정의하거나, URI형식으로 정의하여야 합니다.
{ "https://mytodays.tistory.com/jwt_claims/is_admin": true }
- Public Claims는 사용자 정의 클레임입니다. 공개용 정보를 위해 사용되며, 클레임의 충돌을 피하기 위해 IANA JSON Web Token Registry 에 정의하거나, URI형식으로 정의하여야 합니다.
- Private claims
Private claims
는 통신을 하는 양 측간 협의하에 사용되는 클레임입니다.{ "user_email": "lacuna7304@gmail.com", "user_name": "dongjunLim" }
Signature
Signature는 JWT
의 마지막 부분입니다. Signature는 header
와 payload
의 값을 Base64로 인코딩하고, 비밀키를 통해, header
에서 정의한 알고리즘으로 해싱합니다. 이렇게 만든 값을 다시 Base64형태로 변환합니다. 아래는 Signature의 과정을 나타낸 수도코드입니다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
이렇게 만든 header
, payload
, signature
를 모두 합치면 하나의 Json Web Token
이 완성됩니다.
다음은 JWT 공식사이트에서 만들어본 JWT
입니다.
지금까지 Json Web Token
의 개념과 구조를 알아보았습니다. Json Web Token
은 Self-contained와 이를 통한 stateless 특성을 가지는 장점이 있지만, 토큰 자체에 정보가 담겨있다는 점과, 정보의 크기가 커질수록 통신비용이 증가한다는 단점이 있습니다. 따라서 JWT
를 무작정 사용하는게 아니라 구현하고자 하는 서비스를 고려해 사용해야 합니다. 정보를 전송하는 방법은 JWT
만 있는게 아니니까요.