본문 바로가기

취미

JWT(JSON Web Token)

JWT(JSON Web Token)

클레임 기반 인증

클레임 기반 인증 구성이란 어플리케이션에서 사용자는 클레임의 조합으로 된 ID를 식별에 사용하며 각 클레임은 사용자의 이름, 메일, 만료일 등이 포함 될 수 있다. 즉 외부 ID발급시스템 혹은 인증시스템에서 사용자 및 사용자의 요청에 대해 필요한 모든 정보를 ID필드에 구성하여 어플리케이션에 제공한다. 여기에는 신뢰할 수 있는 기관에서 ID데이터가 발급되었다는 암호화 보장도 포함된다.

이 모델에서는 간편하게 SSO(Single Sign on) 솔루션을 구현할 수 있고 사용자 인증, 계정정보저장, ID정보 조회 등을 어플리케이션에서 수행할 필요가 없다.

이 모델을 적용하는 경우 어플리케이션에서 사용자의 클레임 ID 관련 사항을 결정한다. 이러한 결정 사항은 사용자 이름, 권한, 개인설정 및 어플리케이션의 리소스 등 다양하게 결정할 수 있다.  또한 이러한 식별 ID는 토큰이라는 봉투에 요청에 필요한 정보가 담겨져 오기 때문에 추가적인 데이터를 가져올 필요가 없고 어플리케이션에서 토큰 관리 혹은 저장을 위한 외부 시스템이 필요 없다. 결과적으로 어플리케이션에서는 인증 과정을 단순화 시킬 수 있다.

JWT(JSON Web Token)

JWT는 JSON Object에 요구사항을 담아 JWS(JSON Web Signature)과 JWE(JSON Web Encryption)를 페이로드로 사용하여 인코딩한 문자열로 HTTP Authorization headers 나 URL Query 파라미터 같은 곳에서 가볍게 사용 될 수 있도록 설계되었다.

JWT는 Claim기반 모델을 사용한다. JWT은 Claim을 JSON을 이용해서 정의한다.

{

“sub” : “doyoung”,

“iat”: 1476091409,

“exp”: 2796091449,

“type”: “access_token”,

“company”: “i2sec”,

“role”: [“admin”]

}

JWT 예시

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0Nzc4MjY4MzUsInJvbGUiOlsiYWRtaW4iXSwic3ViIjoiZXhhbXBsZSIsImV4cCI6MTQ3NzgyNzQzNX0.Qgd50uQED3rrBMB172MPKqPjraeKhQ-YYWJa_QRIeug

JWT는 마침표(.) 을 기준으로 3부분으로 나누어져 있는데 헤더와, Claim Set 또는 paylaod, 그리고Signature 라고 부른다.

%e3%85%81%e3%85%81

https://jwt.io/ 사이트에서 JWT을 디코딩한 모습.

JOSE(JSON Object Signing and Encryption)

빨간색으로 표시된 부분은 JOSE 헤더로 JWT의 Payload와 Signature를 어떻게 해석할지 표시하여 Base64 인코딩을 한다.

%e3%85%8b%e3%85%8b

가장 많이 사용되어 지는 암호화 알고리즘으로는

  • HMAC + SHA256
  • RSASSA-PKCS1-v1_5 + SHA256
  • ECDSA + P-256 + SHA256

그 외에 알고리즘에 대해서 RFC7518에서 확인 할 수 있다.

ㅁㅁㅂ.png

Claim Set

ㅁㅁㅂ2.png

JWT Claim Set은 실제 토큰의 필요한 정보를 넣어 Base64 인코딩하여 표시한다.

토큰을 바로 디코딩하여 확인할 수 있기 때문에 DB에 조회할 필요없이 사용자를 확인할 수 있다.

Signature

JOSE 헤더와 Claim Set만으로 encode한다면 누구나 다시 이 값을 변조해낼 수 있기 때문에 Signature부분이 있다. 이 곳에서 헤더에서 지정했던 알고리즘으로 인코딩하여 Signature를 생성한다. 이렇게 3부분을 마침표로 구분하여 JWT를 만든다.

JWT는 Claim 방식을 사용기 때문에 토큰 안에 서비스를 호출한 사용자에 대한 정보가 들어가 있고 데이터베이스 또는 캐시 서버에 조회할 필요가 없어서 인증 로직을 단순화 시킬 수 있고 서버 Stateless를 유지할 수 있다.

하지만 JWT에도 유의할 점이 있다.

토큰을 강제로 만료 시킬 수 없다는 것이다.

토큰을 발급할 때 토큰의 만료 시간을 결정하는 등의 유효조건을 설정하기 때문에 로그아웃을 하더라도 클라이언트에서 토큰을 제거하는 뿐이지 누군가 토큰을 탈취한다면 토큰이 만료되기 전까지 그 토큰을 유효하게 사용할 수 있다.

'취미' 카테고리의 다른 글

계양산 등산  (0) 2019.08.07
AWS DynamoDB, Lambda를 이용한 auto scaling #2  (2) 2017.02.20
AWS DynamoDB, Lambda를 이용한 auto scaling #1  (0) 2017.02.19
아이폰 MAC address 랜덤화  (3) 2016.04.09
802.11 Management Frame Format  (0) 2016.02.15