[front-end] JWT의 개념

김형석·2022년 8월 8일
0

개념공부 스터디

목록 보기
23/27

JTW(Json Web Token) 토큰이란?

클라이언트와 서버, 서비스와 서비스 사이 통신 시 권한 인가(Authorization)를 위해 사용하는 토큰
사용자 인증 과정(authentication)에서 "로그인한 사용자 = 실제 서버로 request를 요청한 사용자"의 일치 여부를 확인하여 권한을 부여하는 authorization의 개념에 해당된다.

1. JWT token의 구조

  • Header(헤더) : Algorithm(알고리즘) + Token Type(토큰 타입)
  • Payload(페이로드) : Data(데이터)
  • Signature(서명)

2. JWT token 사용 여부로 살펴보는서버 작동 방식 차이

  • 기존 로그인 방식(session based server) : 서버 메모리의 세션에 유저 정보를 저장하고, 해당 세션 ID를 쿠키로 전송한다.

    서버에 관련 정보들이 저장된다.

  • JWT 토큰을 사용한 로그인 방식 : 유저에게 암호화된 JWT토큰을 부여해서 브라우저로 해당 토큰을 전송한다.

    JWT토큰을 사용할 경우 서버에는 아무 정보도 저장되지 않는다. JWT토큰에 모든 user정보가 저장되어 있다.

JWT의 장단점

JWT의 장점

  • JWT 의 주요한 이점은 사용자 인증에 필요한 모든 정보는 토큰 자체에 포함하기 때문에 별도의 인증 저장소가 필요 없다.
  • 쿠키를 전달하지 않아도 되므로 쿠키를 사용함으로써 발생하는 취약점이 사라진다.
  • URL 파라미터와 헤더로 사용
  • 트래픽 대한 부담이 낮음
  • REST 서비스로 제공 가능
  • 내장된 만료
  • 독립적인 JWT

JWT 단점 및 고려사항

  • Self-contained: 토큰 자체에 정보를 담고 있으므로 양날의 검이 될 수 있다.
  • 토큰 길이: 토큰의 페이로드(Payload)에 3 종류의 클레임을 저장하기 때문에, 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.
  • Payload 인코딩: 페이로드(Payload) 자체는 암호화 된 것이 아니라, BASE64로 인코딩 된 것이다. 중간에 Payload를 탈취하여 디코딩하면 데이터를 볼 수 있으므로, JWE로 암호화하거나 Payload에 중요 데이터를 넣지 않아야 한다.
  • Stateless: JWT는 상태를 저장하지 않기 때문에 한번 만들어지면 제어가 불가능하다. 즉, 토큰을 임의로 삭제하는 것이 불가능하므로 토큰 만료 시간을 꼭 넣어주어야 한다.
  • Tore Token: 토큰은 클라이언트 측에서 관리해야 하기 때문에, 토큰을 저장해야 한다.

JWT 인증 방식

대략적인 JWT를 사용한 인증이 흐름은 아래와 같다.

  1. 헤더 or 페이로드가 변조되지 않았는지 확인한다.
  2. 페이로드가 만료일(exp) 등에 문제가 없는지 확인한다.
  3. 문제가 없으면 인증이 완료된다.

로그인 이전

  1. 클라이언트에서 사용자 정보(id, pw 등)을 요청한다.
  2. 서버에서 받은 id와 pw 검증을 한다.
  3. 검증이 되었다면, 개인 키 JWT 발행한다.(인증 된 사용자 정보와 유효 기간을 포함한다.)
  4. 발행한 JWT를 HTTP응답 헤더 Cookie에 담아 클라이언트에 반환한다.
  5. 로그인이 완료된다.

로그인 이후

  1. 클라이언트에 LocalStorage에 토큰이 있는지 확인한다.
  • 토큰이 있다면, 그 유효 기간을 확인하고 HTTP 헤더에 넣어 서버에 요청한다.
  • 유효 기간이 끝났다면, 서버에 요청하고 서버에서는 토큰을 갱신(새로 고침)하여 반환한다.
  • 클라이언트에서는 처음 등록할 때와 마찬가지로 돌아온 토큰을 LocalStorage에 저장한다.
  • 토큰이 없다면, 사용자에 따라 적절한 페이지로 리다이렉트한다.
  1. 서버에서 비밀 키(secret-key)를 사용하여 받은 JWT가 손상되지 않았는지 확인하고, 만료되지 않았는지 확인한다.
  • 토큰이 유효하다면, 그대로 처리를 계속 필요에 따라 클라이언트에 데이터를 반환한다.
  • 토큰이 유효하지 않으면, 인증 오류를 클라이언트에 응답한다.

참고 : 링크텍스트

profile
블로그 이사 : https://hengxi.tistory.com

0개의 댓글