JWT Token

서재환·2022년 10월 26일
0

Django

목록 보기
34/40

JWT Token

JWT

  • JSON Web Token의 약자로 인증 인가 관련 기술이다. 요청을 보낼 때 Header + payload + signature를 통해 인증 및 인가 를 처리한다.

  • Claim 기반 인증이라 불린다. 서비스를 호출한 사용자 속성이 서비스 호출 시 담겨서 전송되기 때문이다.

  • Claim 기반 인증의 장점은 Token 안에 서비스를 호출한 사용자 정보가 들어 있어 인증과 관련해 해당 토큰으로 처리할 수 있다. OAuth 인증과는 다르게 Token과 관련한 정보를 별도로 서버에 저장하여 관리하지 않는다.

  • header.payload.signature 또는 header.payload.HMAC 방식으로 복호화 한다. 복호화 하는 이유는 토큰을 변조해서 사용할 수 있기 때문이다.

헤더가 필요한 것은 위변조를 방지하기 위함이고, header에 알고리즘 typ(타입)을 명시하는 이유는 해쉬 알고리즘이 여러개이기 때문이다. 예제에선 SHA-1(256)을 사용한다.

Payload

token의 두번째 부분은 payload이다. payload에는 entity에 대한 statements와 부가 정보가 들어가 있다. registered, public 그리고 private claims 3종류가 있다.

Payload = 'entity statements' + 'additional data'

아래 그림은 payload를 구성할 수 있는 하나의 예시이다.

signature

  • header base64 + payload base64 + SECRET_KEY 를 이용해 발행된다.
  • 헤더페이로드 내용이 변경 될 경우 서명이 무효화 되어 인증인가를 SECRET_KEY를 통해서 check 하므로 SECRET_KEY를 잘 관리해야한다.

access token 와 refresh token

  • 사용자의 아이디와 비밀번호를 통해 access tokenrefresh token 을 획득할 수 있다.
  • 전자가 후자보다 만기가 짧다.
  • access token 이 만료되면 refresh token 을 통해 재발급 받는다.
  • 둘다 만기 되면 다시 로그인 해서 발급받는다.

적용 방법

  • class CustomTokenObtainPairView(TokenObtainPairView) TokenObtainPairView 를 상속받은 클래스를 선언 후

  • 해당 serializer_class 에 커스텀한 CustomTokenObtainPairSerializer 시리얼라이저를 선언한다.

  • 해당 serializer은 TokenObtainPairSerializer 를 상속받는다.'

  • 그리고 해당 serializer에서 get_token 을 오버라이딩 해서 아래와 같이 token 획득 후

token = super().get_token(user)
  • 에 넣고자 하는 속성 을 추가해서 후에 has_permission 을 오버라이딩 해서 위에서 넣은 부분을 체크함으로써 JWT token을 사용한다.

공식문서

참고자료

JWT

0개의 댓글