.etc

0. JWT(Json Web Tocken)의 기본 개념

오늘의개발부 2019. 7. 4. 18:24
반응형

JWT를 활용하기 위한 기본 개념에 대해서 정리해보려고 합니다.
여러 포스트를 참고하여 작성했습니다. (참고 포스트 링크는 하단에 있습니다)
이 링크(https://jwt.io/)에서 JWT 데이터를 확인해볼 수 있습니다.

JWT(Json Web Tocken)

  1. 개념 : Stateless한 서버 운영을 가능하게 하는 토큰 기반 인증시스템 구현체

  2. 형태 : '.' 구분자로 나뉘는 3개의 문자열 (header.payload.signature)

    • header(헤더)

      • 두가지 정보를 지닌다(typ, alg)
          {
              "typ":"JWT", // 토큰 타입 지정(JWT)
              "alg":"HS256" // 해싱 알고리즘 지정, 이 알고리즘은 토큰을 검증할 때 signature에서 사용된다
          }
    • payload(내용)

      • 토큰에 담을 정보. 정보의 한 조각을 claim이라고 부르며, 키값 쌍으로 구성. 한 토큰에 여러 개의 claim을 넣을 수 있다. claim은 세 종류로 나뉜다.

        1. 등록된(registerd) claim : 서비스에서 필요한 정보가 아닌, 토큰에 대한 정보를 담기 위해 이미 정해진 claim들. 선택적으로 사용함.

          • iss : 토큰 발급자 (issuer)
          • sub : 토큰 제목 (subject)
          • aud : 토큰 대상자 (audience)
          • exp : 토큰 만료 시간 (expiration). 시간은 NumericDate 형식이어야하며 현재시간 이후어야함.
          • nbf : Not Before을 의미하며 토큰의 활성 날짜와 비슷한 개념. NumericDate형식이어야하며 이 날짜가지나기 전까지 토큰이 처리되지 않음.
          • iat : 토큰이 발급된 시간(issued at). 이 값을 이용해 토큰의 age를 판단.
          • jti : JWT 고유 식별자로서 중복처리 방지에 사용. 일회용 토큰 처리에 유용함.
        2. 공개(public) claim : 충돌이 방지된(collision-resistant) 이름을 가지고 있어야 함. 충돌 방지를 위해 URI 형식으로 지음.

           {
               "https://velopert.com/jwt_claims/is_admin":true
           }
        3. 비공개(private) claim : 서버와 클라이언트 협의 하에 사용되는 claim들. 등록된 claim과 중복될 수 있으니 주의.

           {
               "username" : "velopert"
           }
    • signature(서명)

      • 헤더의 인코딩값과 정보의 인코딩값을 합친 후 비밀키로 해쉬하여 생성.
  3. 주의점

    • claim Set은 암호화되지 않는다. 서명 없이 누구나 열어볼 수 있기 때문에 보안에 중요한 데이터는 넣으면 안 된다.
    • 인코딩 특성상 claim Set이 길어지면 토큰 길이도 길어진다. 너무 많은 정보를 담으면 안 된다.
    • 서버가 토큰을 가지고 있지 않아 강제로 만료시킬 방법이 없다. 토큰을 탈취 당하면 해당 토큰은 만료시까지 유효하게 된다.
  4. 참고 및 예제
    https://velopert.com/2389
    https://medium.com/@OutOfBedlam/jwt-%EC%9E%90%EB%B0%94-%EA%B0%80%EC%9D%B4%EB%93%9C-53ccd7b2ba10

JWT의 활용편으로 이어집니다.

반응형