JWT - Json Web Token
by SoonYong Hong
Json Web Token
Json Web Token 이란
Json Web Token은 웹표준 (RFC 7519)에 포함되는 기술로 JSON 형태로 정보를 전달하는데 사용됩니다.
Json Web Token의 형태
기본적인 형태
{base64 encoded header}.{base64 encoded payload}.{base64 encoded verify signature}
JWT는 header, payload, verify signature가 .
로 구분되어 연결된 String이다.
예시
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIwMDEiLCJuYW1lIjoiU29vbiBZb25nIiwiaWF0IjoxNTE2MjM5MDIyfQ.PBnQxnoLroVbIYI-egDMX4_74JxlhSgP2dPrFaKO2rE
예시 (base64 decoded)
{
"alg": "HS256",
"typ": "JWT"
}.
{
"sub": "001",
"name": "Soon Yong",
"iat": 1516239022
}.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
)
Json Web Token의 내부 정보
Header
- alg - verify signature에 사용된는 암호화 알고리즘
- typ - Json Web Token의 경우
JWT
의 값만 가진다.
payload
어플리케이션에서 사용할 정보를 담는다.
verify signature
header의 alg에 명시된 알고리즘으로 미리 정한 secret key를 이용하여 {base64 encoded header}.{base64 encoded payload}
를 암호화한다.
Json Web Token의 사용 방법
Json Web Token의 중요한 정보를 담고있는 payload부분에 아무런 암호화를 하지 않는다.
base64 인코딩이 되어있지만 이는 보안의 목적이 아닌 데이터 전송을 위하여 데이터의 형태만 변화한 것이다.
즉 Json Web Token의 header와 payload는 손쉽게 변조될 수 있다.
그렇기 때문에 이 데이터가 올바른 데이터임을 보장하기 위해서 verify signature가 존재한다.
verify signature는 {base64 encoded header}.{base64 encoded payload}
를 본인만 알고있는 secret key를 이용하여 암호화한다.
즉, 가져온 JWT의 {base64 encoded header}.{base64 encoded payload}
를 암호화한 값과 가져온 JWT의 verify signature가 일치한다면 이 JWT는 본인이 작성한 JWT임을 알 수 있게 된다.
누군가가 header나 payload의 내용은 변조할 경우, 그에 맞는 verify signature를 구할 수 없어서 서비스에서 검증을 통과할 수 없다.
이 secret key를 대칭키가 아닌 비대칭키로 사용하여 private key로 암호화하고 public key로 검증한다면 다른 서비스에 내 데이터를 안전하게 전달할 수 있다.
단, 어디까지나 데이터가 변조되지않음을 보장할 뿐 데이터가 외부에 노출되어 있기 때문에 중요한 정보는 암호화 없이 JWT로 제공하는 방법은 옳지 못하다.
세션을 대신하여 JWT의 사용
대칭키 방법의 JWT는 로그인 후 Session을 대신하여 authentication을 제공하는데 많이 사용된다.
Session 방식의 로그인은 유저가 로그인시 서버의 Session에 유저정보를 저장하고 User에겐 SessionID를 Cookie로 제공한다.
JWT를 이용하는 방식은 유저가 로그인시 User에게 유저정보가 담긴 JWT를 Cookie로 제공한다.
이 쿠키를 매 Http Request마다 검증하여 JWT의 Payload에 담긴 유저정보를 바탕으로 유저에게 서비스를 제공한다.
Json Web Token 사용하기
Json Web Token은 웹 표준 기술이기 때문에 이미 많은 라이브러리가 다양한 언어로 제공되고 있다. 자세한 내용은 https://jwt.io/에서 확인할 수 있다.
Subscribe via RSS