본문 바로가기

Programming

JWT(JSON Web Token)에 대하여

반응형

안녕하세요. 남산돈가스입니다.

오늘은 JWT(JSON Web Token)에 대해서 알아보겠습니다.

정의

JWT 공식홈페이지에 따르면 JWT는

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

JSON Web Token은 두 집단 간에 안전하게 정보를 표현하기 위한 공개 된 산업 표준 RFC 7519 방식이다.

라고 정의되어 있습니다. 사실 이해 못할 용어들로 해석했지만 중요한 키워드로는 안전, 정보, 표현 정도가 될 것 같습니다.

약자 그대로, 제 마음대로 해석해보면 'Web상에서 사용되는 JSON형식의 Token이겠다' 정도일 것 같습니다.

특징

JWT는 대표적으로 두 가지 특징을 가지고 있습니다.

  1. Self-contained ( 자가 수용적 ): JWT 자체적으로 필요한 모든 정보를 포함합니다. 헤더 정보와, 실제 전달할 데이터, 검증할 수 있는 서명 데이터를 모두 포함하고 있습니다.
  2. 신뢰할 수 있다: JWT는 디지털 서명에 의해 검증할 수 있으며 신뢰할 수 있습니다. 비밀 값을 사용하는 HMAC 알고리즘이나 RDS or ECDSA와 같은 공개키, 개인키 쌍으로 서명될 수 있습니다.

JWT 사용이유

  1. 보안 : 클라이언트 환경에서 서비스의 인증 방식을 사용하여 로그인 하면, 서버로부터 JWT를 응답받게 됩니다. 이후 클라이언트는 이 토큰을 각자의 방식으로 저장한 뒤 서버에 Resource가 필요할 경우 이 토큰을 요청과 함께 보내 본인이 인증 된 사용자라는 것을 확인합니다. 이런 인증방식은 기존의 쿠기/세션을 사용하는 방식보다 많은 보안 이슈를 막을 수 있습니다. 또한 이 토큰은 일정한 유효시간이 존재하기 때문에 통신 중간에 탈취되더라도 만료 이후엔 이용 가치가 떨어지기 때문에 안전한 통신을 할 수 있습니다.
  2. 데이터 용량 : JWT는 기존 XML 등의 방식보다 복잡하지 않고 간결하며 인코딩 된 사이즈 또한 작기 때문에 사용성 측면에서 활용도가 높습니다.
  3. 사용성 : 제공되는 형식이 JSON이다보니 근래의 프로그래밍 환경에서 모두 지원되므로 사용성이 높습니다.

JWT 구조

JWT는 헤더, 내용, 서명으로 총 3개의 파트가 .으로 구분되어 있습니다. JWT공식홈페이지에서 제공하는 예시를 보면

이런식으로 구성되어있습니다.

헤더(Header)

헤더는 두 가지 요소로 구성되어있습니다.  토큰의 타입과 서명(Signature)에 사용된 알고리즘 정보입니다. 

내용(Payload)

내용에는 정의에서 보았던 클레임(Claims)을 포함합니다. 클레임은 이 완성된 토큰을 교환할 때 확인할 수 있는 추가적인 내용이 포함됩니다. 

이 클레임에서도 미리 정의된 클레임이 있습니다. 이 클레임들은 추가적인 데이터를 제외한 이 토큰에 대한 정보를 담고있습니다. 예를 들면 iss(issuer, 토큰 발행자), exp(expiration time, 토큰 만료시간), sub(subject, 토큰 제목) 등이 있습니다. 

서명(Signature)

서명은 이 토큰이 중간에 변경되지 않았다는 것을 검증하며, JWT를 전송한 클라이언트가 신뢰할 수 있는 대상이라는 것을 인지할 수 있게합니다. 

위에서 설명한 세가지 항목들을 base64 인코딩하여 . 으로 구분하여 사용할 수 있는 JWT가 완성됩니다.

감사합니다.

참고
JWT 공식홈페이지 - https://jwt.io

JWT(Json Web Token) 소개 -
https://medium.com/sjk5766/jwt-json-web-token-소개-49e211c65b45