티스토리 뷰

Web/JWT

JWT (JSON Web Token)

mnm11 2018. 5. 12. 23:53

JWT (JSON Web Token) ?

  • 웹표준(RFC 7519)으로서 두 개체에서 JSON 객체를 사용하여 가볍고 자가수용적인(self-contained)방식으로 정보를 안전성 있게 전달합니다.
  • 대부분의 주류 프로그래밍 언어에서 지원됩니다.
  • 자가 수용적입니다.
    • JWT는 필요한 모든 정보를 자체적으로 지니고 있습니다.
    • 토큰이 검증되었다는 것을 증명해주는 Signature를 포함하고 있습니다.
  • 쉽게 전달될 수 있습니다.
    • 웹 서버의 경우 HTTP의 Header에 넣어서 전달할 수 있고, URL의 파라미터로 전달할 수도 있습니다.

JWT는 어떤 상황에서 사용되는가

  • 회원인증
    • 유저가 로그인하면, 서버는 유저의 정보에 기반한 토큰을 발급합니다.
    • 그 후, 유저가 서버에 요청할 때마다 JWT를 포함하여 전달합니다.
    • 서버가 클라이언트에게서 요청을 받을 때마다 해당 토큰이 유효하고 인증됐는지 검증하고, 유저가 요청한 작업에 권한이 있는지 확인하여 작업을 처리합니다.
  • 정보교류
    • 정보가 sign이 되어있기 때문에 정보를 보낸이가 바뀌진 않았는지, 또 정보가 도중에 조작되지는 않았는지 검증할 수 있습니다.

JWT의 생김새

JWT의 생김새

헤더(Header)는 2가지의 정보를 가지고 있습니다.

  • typ : 토큰의 타입을 지정합니다.
  • alg : 해싱 알고리즘을 지정합니다. 해싱 알고리즘은 보통 HMAC SHA256 또는 RSA가 사용되며, 이 알고리즘은 토큰을 검증할 때 사용되는
    signature부분에서 사용됩니다.
{
   "typ" : "JWT",
   "alg" : "HS256"
}

정보(Payload) 부분에는 토큰에 담을 정보가 들어있습니다.

  • 여기에 담는 정보의 한 '조각’을 클레임(claim)이라고 부르고, 이는 name/value의 한 쌍으로 이루어져 있습니다.
  • 토큰에는 여러개의 클레임들을 넣을 수 있습니다.
  • 클레임의 종류는 다음과 같이 크게 세 분류로 나뉘어 있습니다.
    • 등록된(registered) 클레임

      등록된 클레임들은 서비스에서 필요한 정보들이 아닌 토큰에 대한 정보들을 담기 위하여 이름이 이미 정해진 클레임들입니다.
      등록된 클레임의 사용은 모두 선택적이며, 이에 포함된 클레임 이름들은 다음과 같습니다.

      • iss : 토큰 발급자 (issuer)
      • sub : 토큰 제목 (subject)
      • aud : 토큰 대상자 (audience)
      • exp : 토큰의 만료시간(expiration), 시간은 NumericDate형식으로 되어있어야 하며(예: 1480849147370) 언제나 현재 시간보다 이후로 설정되어 있어야 합니다.
      • nbf : Not Before를 의미하며, 토큰의 활성 날짜와 비슷한 개념입니다. 여기에도 NumericDate형식으로 날짜를 지정하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않습니다.
      • iat : 토큰이 발급된 시간(issued at), 이 값을 사용하여 토큰의 age가 얼마나 되었는지 판단할 수 있습니다.
      • jti : JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용됩니다. 일회용 토큰에 사용하면 유용합니다.
    • 공개(public) 클레임

      공개 클레임들은 충돌이 방지된(collison-resistant) 이름을 갖고 있어야 합니다. 충돌을 방지하기 위해서는 클레임 이름을 URI 형식으로 짓습니다.

    • 비공개(private) 클레임

      등록된 클레임도 아니고 공개된 클레임들도 아닙니다. 양측 간에 (보통 클라이언트 <-> 서버) 협의 하에 사용되는 클레임 이름들입니다. 공개 클레임과는 달리 이름이 중복되어 충돌이 일어날 수 있으니 사용할 때 유의해야 합니다.

서명(signature)

  • JWT의 마지막 부분은 바로 서명입니다. 이 서명은 헤더의 인코딩 값과 정보의 인코딩 값을 합친 후 주어진 비밀키로 해시를 하여 생성합니다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함