-
JWT 에 대한 간단 정리Java/Spring 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
https://blog.outsider.ne.kr/1160
반응형'Java > Spring' 카테고리의 다른 글
[Spring Security] CORS 에 대하여 (0) 2019.11.11 Spring Security 정리 (1) 2019.10.05 [Spring] @Transactional 속성 정리 (0) 2019.09.06 Spring AOP PointCut 표현식 정리 (0) 2019.07.21 맨날 까먹는 AOP 정리 (1) 2019.07.20