JSON Web Token의 약자로 인증 인가
관련 기술이다. 요청을 보낼 때 Header + payload + signature
를 통해 인증 및 인가
를 처리한다.
Claim 기반 인증
이라 불린다. 서비스를 호출한 사용자 속성
이 서비스 호출 시 담겨서 전송되기 때문이다.
Claim 기반 인증의 장점은 Token 안에 서비스를 호출한 사용자 정보가 들어 있어 인증과 관련해 해당 토큰으로 처리할 수 있다. OAuth 인증과는 다르게 Token과 관련한 정보를 별도로 서버에 저장하여 관리하지 않는다.
header.payload.signature
또는 header.payload.HMAC
방식으로 복호화 한다. 복호화 하는 이유는 토큰을 변조해서 사용할 수 있기 때문이다.
헤더가 필요한 것은 위변조를 방지하기 위함이고, header에 알고리즘 typ(타입)
을 명시하는 이유는 해쉬 알고리즘이 여러개이기 때문이다. 예제에선 SHA-1(256)을 사용한다.
token의 두번째 부분은 payload이다. payload에는 entity에 대한 statements와 부가 정보가 들어가 있다. registered, public 그리고 private claims 3종류가 있다.
Payload = 'entity statements' + 'additional data'
아래 그림은 payload를 구성할 수 있는 하나의 예시이다.
header base64 + payload base64 + SECRET_KEY
를 이용해 발행된다.헤더
나 페이로드
내용이 변경 될 경우 서명이 무효화
되어 인증인가를 SECRET_KEY
를 통해서 check
하므로 SECRET_KEY
를 잘 관리해야한다.access token
과 refresh 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
을 사용한다.