JWT(Json Web Token)

egov

JWT

JWT란 Json Web Token 의 줄임말로 JSON 객체를 사용하여 가볍고 자가수용적인 방식으로 정보를 안전성 있게 전달해준다.

여기서 자가 수용적인 방식이란 필요한 정보를 자체적으로 지니고 있다는 말이다.

JWT의 모양새는 aaaaaaa.bbbbbbb.cccccccc 인데 a부분은 헤더이고 b는 내용(페이로드) c는 헤더,내용과 시크릿키를 이용해 암호화한 부분이다.

헤더는 두가지의 정보를 지니고 있다.

typ : 토큰의 타입을 지정한다. “JWT” alg : 해싱 알고리즘을 지정. 보통 RSA나 SHA256을 사용된다.

    {
        "typ" : "JWT",
        "alg" : "HS256"
    }

페이로드안에 들어갈 내용은 클레임이라고도 한다. 보통 클레임은 3가지가 있는데 등록된클레임, 공개클레임, 비공개클레임이 있다. 등록된 클레임에는 토큰에 대한 정보들을 담기 위해 이름이 이미 정해진 클레임들이다. 모두 선택적이다.


    # 등록된클레임
    iss : 토큰 발급자(issuer)
    sub : 토큰 제목 (subject)
    aud : 토큰 대상자
    exp : 토큰의 만료 시간 (언제나 현재보다 이후로 설정되어있어야함)
    nbf : 이날짜가 지나야 토큰이 정상적임.
    iat : 토큰이 발급된 시간( 이값을 사용하여 토큰의 age가 얼마인지 판단가능)
    jti : JWT의 고유 식별자로 중복적인 처리를 방지하기 위해 사용. 일회용 토큰에 사용하면 유용하다.


    # 공개 클레임
    {
        "http://hyojun123.github.io/jwt/isOk":true
    }
    형식이다.

    # 비공개 클레임

    {
        "username" : "hj"
    }



    # 예제 Payload

    {
        "iss": "hyojun123.github.io",
        "exp": "1485271111111",
        "http://hyojun123.github.io/jwt/isOk": true,
        "userId": "123123",
        "username": "hj"
    }

Signature(서명)

JWT의 마지막 부분은 바로 서명이다. 이 서명은 헤더의 인코딩 값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬해서 생성한다.

    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      secret)

이건 수도코드이고 각자 환경에 맞는 라이브러리를 사용해 만들수 있다.

만든 결과는
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiaGoiLCJleHAiOjE1MzE3NDIwMjEsImVtYWlsIjoiYWFhQG5hdGUuY29tIn0.NkTMN6XDJlDp1MrWLgLZ_iifOXJIJjkxB9Nw6QWQKDU
이러한 형태이다.

이러한 JWT는 어떤상황에서 사용할까?

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

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

MSA(Micro Service Architecture) : 이건 내생각이다. 마이크로 서비스 아키텍쳐에서는 세션을 공유하는게 어렵기 때문에 JWT를 이용하여 각 서비스간에 JWT를 이용하여 인증을 하면 된다고 생각한다. 또한 만약 서버단과 클라이언트 단이 완전히 분리되어있다면 서버에서 세션을 가지고있을수 없고, 쿠키는 보안이 안좋기 때문에 사용하기 어렵다. 하지만 JWT를 이용한다면 가능하다고 생각한다. 하지만 어떠한 토큰이던지 시크릿키가 털리게되면 그 서버는 끝장이기때문에 시크릿키를 잘 관리할 필요가 있다.

다음번엔 JWT를 구현한 소스코드를 올릴것이다.

효준's profile image

효준

2018-07-16 18:03

다른글 보러가기

JPA 메서드 정리

이전 포스트

스프링 부트에서 JWT(Json Web Token) 구현

다음 포스트