Java/Spring

JWT 에 대한 간단 정리

Icarus8050 2019. 8. 4. 22:58
반응형

JWT 가 뭐하는 놈이지??

 JWT는 JSON Web Token 의 약자로써, 가볍고(compact) 자체적으로 필요한 정보를 담는(self-contained) 방법으로 두 개체간에 JSON 객체를 안전하게 전송하기 위한 개방형 표준(RFC 7519)입니다. JWT는 작은 크기 덕분에 URL 파라미터나 HTTP Header에 담아서 빠르게 전송할 수 있습니다. JWT의 구조중 하나인 PayLoad 에는 데이터 베이스에 두 번 이상 쿼리할 필요가 없도록, 유저에 대해 필요한 정보를 담을 수 있습니다.

 

JWT 는 언제 사용하면 좋을까요??

 Authenticatio (인증) : 가장 일반적으로 JWT를 사용하는 경우입니다. 유저가 한 번 로그인하고 나면 사용자의 정보를 담은 토큰을 발급합니다. 이후의 요청에 대해서는 발급받은 토큰을 포함하여 서버에 전송하면, 서버는 해당 토큰이 유효한지, 요청에 대한 권한이 유효한지를 검사하여 사용자에게 서비스나 자원을 제공할 수 있습니다. 토큰을 가지고 인증을 처리하므로 서버측에서는 세션을 유지할 필요가 없는 장점이 있습니다.

 

 Information exchange (정보 교환) : JWT는 공개키 암호화같은 방식을 사용하므로 전송한 사용자가 위조되지는 않았는지, 정보가 조작이 되지는 않았는지 검증할 수 있습니다. 그렇기 때문에 두 개체간에 정보를 안전하게 전송할 수 있습니다.

 


JWT의 구조

 JWT는 3가지의 구조로 되어 있으며, 각 구조는 ' . ' 으로 분류되어 있습니다.

  • Header
  • PayLoad
  • Signature

XXXXXX.YYYYYY.ZZZZZZ

(Header) (PayLoad) (Signature)

 

1. Header

 헤더에는 일반적으로 두 가지의 요소로 이루어져있습니다.

typ : "JWT" 같은 토큰의 타입을 기술합니다.

alg : HMAC SHA256 이나 RSA 와 같은 사용된 해싱 알고리즘을 기술합니다.

 

For example :

{
  "alg": "HS256",
  "typ": "JWT"
}

이러한 JSON 정보는 Base64 로 인코딩되어 JWT의 첫 부분을 형성합니다.

https://jwt.io/ 에서 이러한 정보를 Base64로 인코딩해보면 아래와 같은 결과가 나옵니다.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 (인코딩된 JWT의 헤더)

 

2. PayLoad

 페이로드에는 claim 을 담고 있습니다. 클레임이란 사용자에 대한 프로퍼티를 담고있는 정보입니다. 클레임에는 3가지 타입이 있습니다.

 

Reserved Claims

 Reserved Claims는 정보 교환에 유용하도록 미리 정의되어 있는 클레임입니다. 이 클레임은 필수적이지 않고, Optional 합니다.

  • iss (issuer : 토큰 발급자)
  • exp (expiration time : 만료 시간)
  • sub (subject : 클레임의 주제)
  • aud (audience : 토큰의 수신자)
  • nbf (not before 를 의미합니다. 이 시간 이전에는 토큰을 처리하지 않아야 함을 나타냅니다.)
  • iat (issued at : 토큰의 발급 시간)
  • jti (JWT ID로 JWT의 식별자입니다.)

 

Public Claims

 Public Claims는 JWT 토큰에서 사용하기 위해 정의 되었지만, 충돌이 방지된 네임스페이스를 담고있는 URI 와 같이 이름이 충돌되지 않도록 해야합니다.

 

Private Claims

 두 개체(서버와 클라이언트)가 정보를 공유하기 위해 사용하기로 합의한 클레임 정보입니다.

 

For example :

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

 

 페이로드는 Base64로 인코딩되어 JWT의 두 번째 부분을 구성합니다.

 

3. Signature

 서명은 토큰이 변조되지 않았음을 증명하는 무결성을 위해 사용됩니다. 서명은 인코딩된 헤더, 인코딩된 페이로드, 비밀키, 헤더에 정의된 서명 생성 알고리즘을 이용하여 생성합니다.

 

 https://jwt.io/ 에서 위와 같은 구조로 정의하여 간단한 JWT 토큰을 생성해보면 아래와 같은 결과를 얻을 수 있습니다.

 

 


참고 자료

https://medium.com/@xoor/jwt-authentication-service-44658409e12c

 

Implementing JWT with Spring Boot and Spring Security

Spring Boot JWT

medium.com

 

https://velopert.com/2389

 

[JWT] JSON Web Token 소개 및 구조 | VELOPERT.LOG

지난 포스트에서는 토큰 기반 인증 시스템의 기본적인 개념에 대하여 알아보았습니다. 이 포스트를 읽기 전에, 토큰 기반 인증 시스템에 대해서 잘 모르시는 분들은 지난 포스트를 꼭 읽어주세요. 이번 포스트에서는, 토큰 기반 인증 시스템의 구현체인 JWT (JSON Web Token) 에 대한 소개를 하고, JWT 토큰의 기본 구조를 알아보도록 하겠습니다. JSON Web Token 이 뭘까? 기본 정보 JSON Web Token (JWT) 은 웹표준 (RFC

velopert.com

 

https://blog.outsider.ne.kr/1160

 

JWT(JSON Web Token)에 대해서... :: Outsider's Dev Story

작년에 [JSON Web Token(JWT)에 대한 글](http://blog.outsider.ne.kr/1069)을 올렸다. 당시에는 JWT 처음 사용해 보면서 적은 글이라 그제야 약간 이해한 상황이었지만 시간이 지나면서 더 알게 된 부분도 있고...

blog.outsider.ne.kr

 

https://bcho.tistory.com/999

 

REST JWT(JSON Web Token)소개 - #1 개념 소개

JWT(JSON Web Token)을 이용한 API 인증 - #1 개념 소개 조대협 (http://bcho.tistory.com) REST API에 대한 보안과 인증이 화두가 되면서 많이 언급되는 것이 OAuth인데, 근래에 들어서 화두가 되고 있는 것이 JW..

bcho.tistory.com

 

 

반응형