본문 바로가기
카테고리 없음

JWT 토큰에 대해서 알아보자!

by 근즈리얼 2022. 11. 9.
728x90

이번 글에서는 JWT에 대해서 알아보겠습니다.

 

JWT(JSON Web Token)

- 유저를 인증하고 식별하기 위한 토큰 기반 인증입니다.

그렇다면, 여기서 토큰 기반 인증은 무엇일까요?

-> 클라이언트가 서버에 접속을 하면 서버에서 해당 클라이언트에게 인증되었다는 의미로 '토큰'을 부여합니다.

-> 이 '토큰은' 유일하며 토큰을 발급받은 클라이언트는 또 다시 서버에 요청을 보낼 때 요청 헤더에 토큰을 심어서 보냅니다.

-> 마지막으로 서버에서는 클라이언트로부터 받은 토큰을 서버에서 제공한 토큰과 일치 여부를 체크하여 인증 과정을 처리합니다.

-> 토큰은 세션과 달리 서버가 아닌 클라이언트에 저장되기 때문에 메모리나 스토리지 등을 통해 세션을 관리하던 서버의 부담을 줄일 수 있습니다.

- JWT는 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미합니다.

- JWT 기반 인증은 JWT 토큰을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방법입니다.


JWT의 구조

- JWT의 구조입니다.

빨간색은 헤더 (Header),

보라색은 내용 (Playload),

푸른색은 서명(Signature)

입니다.

헤더에는 JWT에서 사용할 타입과 해시 알고리즘의 종류가 담겨있습니다.

내용에는 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있습니다.

마지막으로 서명에는 헤더와 내용을 Base64 URL-safe Encode를 한 이후 헤더에 명시된 해시함수를 적용하고, 개인키로 서명한 전자서명이 담겨있습니다. 

전자서명에는 비대칭 암호화 알고리즘을 사용하므로 암호화를 위한 키와 복호화를 위한 키가 다릅니다. 암호화(전자서명)에는 개인키를, 복호화(검증)에는 공개키를 사용합니다.

 

Header 입니다.

alg : 서명 암호화 알고리즘

typ : JWT

 

PayLoad 입니다.

JWT를 통해서 알 수 있는 데이터입니다. -> 서버와 클라이언트가 주고 받는 시스템에서 실제로 사용될 정보에 대한 내용을 담고 있는 부분입니다.

Signature입니다.

Signature는 (헤더 + 페이로드) 와 서버가 갖고 있는 유일한 key 값을 합친 것을 헤더에서 정의한 알고리즘으로 암호화를 합니다.

signature = Base64Url(Header) + . + Base64Url(PayLoad) + server's key

 

jwt를 인코딩/디코딩 할 수 있습니다!!
https://jwt.io/

 

JWT.IO

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

jwt.io


일반적인 JWT를 사용 순서입니다.

  1. 클라이언트가 ID, PW를 입력하여 서버에 로그인 인증을 요청합니다.
  2. 서버에서 클라이언트로부터 인증 요청을 받으면 Header, PayLoad, Signature를 정의합니다. -> 그리고 Header, PayLoad, Signature를 각각 Base64로 한 번 더 암호화하여 JWT를 생성하고 이를 쿠키에 담아 클라이언트에 발급합니다.
  3. 클라이언트는 서버로부터 받은 JWT 토큰을 로컬 스토리지에 저장하고 API를 요청할 때마다 Authorization Header에 Access Token을 담아서 보냅니다.
  4. 서버는 클라리언트가 Header에 담아서 보낸 JWT가 서버에서 발행한 토큰인지 일치 여부를 확인하고 일치하면 통과 불일치 하면 통과시키지 않습니다.
  5. 클라이언트가 서버에 요청을 했는데, 만일 Access Token의 시간이 만료되었다면 클라이언트는 리프래시 토큰을 이용해서 서버로부터 새로운 액세스 토큰을 발급 받습니다.

JWT 인증의 목적

JWT : H + P + S 입니다.
JWT를 이용하면 인증과 유저의 정보를 알 수 있습니다. (P안에 유저의 정보를 담아 놓는다면!)

그런데 만일 누군가 P를 수정하고 수정된 토큰을 서버에 요청으로 사용한다면 서버는 토큰값이 조작되었음을 알 수 있을 것입니다.

따라서, 서버는 JWT를 이용할 때 토큰 안에 정보가 무엇이 있는지 보다 유효한 토큰인지 확인하는 것이 더 중요합니다.


JWT의 장단점

JWT의 장점

1. Header와 Payload를 가지고 Signature를 생성하므로 데이터 변조를 막을 수 있습니다.

2. 인증 정보에 대한 별도의 저장 공간이 필요 없습니다.

3. JWT는 토큰에 대한 기본 정보와 전달할 정보 및 토큰이 검증되었음을 증명하는 서명 등 필요한 모든 정보를 자체적으로 지니고 있습니다.

4. 확장성이 우수합니다.

5. 토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능합니다.

 

JWT 단점

1. 쿠키/세션과 다르게 JWT 토큰의 길이가 길어, 인증 요청이 많아지면 네트워크 부하를 일으킬 수 있습니다.

2. PayLoad 자체는 암호화되지 않기 때문에 유저의 중요한 정보를 담을 수는 없습니다.

3. 토큰을 탈취당하면 대처하기 어렵습니다.

 

참고자료

https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC

 

[WEB] 📚 JWT 토큰 인증 이란? - 💯 이해하기 쉽게 정리

인증 방식 종류 (Cookie & Session & Token) 보통 서버가 클라이언트 인증을 확인하는 방식은 대표적으로 쿠키, 세션, 토큰 3가지 방식이 있다. JWT를 배우기 앞서 우선 쿠키와 세션의 통신 방식을 복습해

inpa.tistory.com

 

728x90

댓글