본문 바로가기
.etc

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

by 오늘의개발부 2019. 7. 4.
반응형

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의 활용편으로 이어집니다.

반응형