240118 JWT

MINJU KIM·2024년 1월 18일

Spring

목록 보기
10/13

JWT(Json Web Token)

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

사용자가 서버에 접근할 때 이 사용자가 인증된 사용자인지 확인하는 방법

  • 서버 기반 인증
  • 토큰 기반 인증

토큰 기반 인증의 특징

  • 무상태성
    사용자 인증정보가 담겨있는 토큰이 서버가 아닌 클라이언트에 저장됨.
    서버 입장에서는 인증정보를 저장하거나 유지하지 않아도 되기 때문에 무상태로 효율적인 검증을 할 수 있다.

  • 확장성
    결제 서버랑 주문을 위한 서버가 분리되어있다고 했을 때
    세션 인증 기반은 각각의 API에서 인증을 해야하는데 반해 토큰 기반 인증에서는 토큰을 가지는 주제가 서버가 아니라 클라이언트기 때문에 하나의 토큰으로 결제서버와 주문 서버에 요청을 보낼 수 있다.
    (ex. 구글, 네이버, 카카오 아이디로 로그인 인증하기 등 )

  • 무결성
    토큰 방식은 HMAC(hash-based message authentication)기법을 사용한다.
    토큰 발급 이후에 토큰 정보를 변경할 수 없음.
    무결성이 보장된다.

클라이언트가 서버에 요청을 할 때, 추가로 전송해야하는 정보가 늘어나기 때문에 요청/응답 시 payload가 커지는 단점이 있다.

발급받은 JWT를 이용해 인증을 하려면 HTTP 요청 헤더 중에 Authorization 키 값에 Bearer + JWT 토큰값을 넣어서 보내야한다.

헤더 header

토큰의 타입과 해싱 알고리즘을 지정하는 정보가 담겨있다.

내용 payload

토큰과 관련된 정보를 기입한다.
한 덩어리를 클레임이라고 부르고 key-value형태의 한 쌍으로 이루어져있다.
클레임은 공개 클레임, 비공개 클레임으로 나눌 수 있다.

  • 공개클레임 : 공개되어도 상관없는 클레임

관련 용어

iss: 토큰 발급자
iat: 발급된 시간
exp: 만료 시간
aud: 토큰 대상자
sub: 토큰 제목

서명 signature

:해당 토큰이 조작, 변경되지 않았음을 확인하는 용도이다.
헤더의 인코딩 값 + 내용의 인코딩 값을 합친 후에 주어진 비밀키로 해시값을 생성한다.

Access Token, Refresh Token

토큰이 탈취되더라도 피해를 줄이기 위해 토큰의 사용기간 자체를 줄이는 방법을 택한다.
Access Token 유효기간은 짧게 설정
Refresh Token 유효기간은 길게 설정
사용자는 둘 다 서버에 전송하고 Access Token로 인증하고 만료되었을 때는 Refresh Token으로 다시 Access Token을 받는다.
공격자는 Access Token을 탈취하더라도 짧은 유효기간이 지나고 나면 사용할 수 없다.

장점

  1. Header와 Payload를 가지고 Signature를 생성하므로 데이터 위변조를 막을 수 있다.
  2. 인증 정보에 대한 별도의 저장소가 필요없다.
  3. JWT는 토큰에 대한 기본 정보와 전달할 정보 및 토큰이 검증됬음을 증명하는 서명 등 필요한 모든 정보를 자체적으로 지니고 있다.
  4. 클라이언트 인증 정보를 저장하는 세션과 다르게, 서버는 무상태(StateLess)가 되어 서버 확장성이 우수해질 수 있다.
  5. 토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능하다. (쿠키와 차이)
  6. OAuth의 경우 Facebook, Google 등 소셜 계정을 이용하여 다른 웹서비스에서도 로그인을 할 수 있다.
  7. 모바일 어플리케이션 환경에서도 잘 동작한다. (모바일은 세션 사용 불가능)

JWT 단점

  1. Self-contained : 토큰 자체에 정보를 담고 있으므로 양날의 검이 될 수 있다.
    2.토큰 길이 : 토큰의 Payload에 3종류의 클레임을 저장하기 때문에, 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.
  2. Payload 인코딩 : payload 자체는 암호화 된 것이 아니라 BASE64로 인코딩 된 것이기 때문에, 중간에 Payload를 탈취하여 디코딩하면 데이터를 볼 수 있으므로, payload에 중요 데이터를 넣지 않아야 한다.
  3. Store Token : stateless 특징을 가지기 때문에, 토큰은 클라이언트 측에서 관리하고 저장한다. 때문에 토큰 자체를 탈취당하면 대처하기가 어렵게 된다.

출처: https://inpa.tistory.com/entry/WEB-📚-JWTjson-web-token-란-💯-정리 [Inpa Dev 👨‍💻:티스토리]

0개의 댓글