TIL 17 | JWT(Json Web Token)


👻 JWT ?


jwtは、jsonオブジェクトを使用して、2つのオブジェクト間で安定した情報交換を支援するjson web tokenです.

超jwt構造



点(.)全部で3つの部分に分かれている.

1. header


ヘッダーには2つの情報があります.タイプと代数.
指定したタグのタイプを入力します.(jwt)
algはハッシュアルゴリズムを指定します.ハッシュアルゴリズムは、通常、HMAC SHA 256またはRSAを使用し、トークン検証時に署名部分で使用される.

2. payload


コインに入っている情報が入っています.name、valueペアからなり、複数のクレームを加えることができ、大きく3つに分けることができます.登録クレーム、公共クレーム、個人クレーム.

registered claim


これはサービスに必要な情報ではなく、コインに関する情報を含むために命名されたクレームです.登録済みクレームの使用はオプションで、次のタイプがあります.
(1)iss:トークン発行者(発行者)
(2)sub:タグタイトル(subject)
(3)aud:トークン対象(観客)
(4)exp:トークンの有効期限(有効期限)は、NumericDate形式でなければならず、現在の時間以降に決定しなければならない.
(5)nbf:NotBeforeを表し,トークンアクティビティ日付の概念である.この日付までは、トークンは処理されません.
(6)iat:トークン発行時間(発行at)、トークンの年齢(?)見分けがつく.
(7)jti:JWT一意識別子であり、重複処理を防止する.使い捨てコインに役立ちます.

public claim


公開クレームはurl形式で名前を付けることはできません.

private claim


サーバとクライアント間のプロトコルで使用されるクレーム名.公開クレームとは異なり、名前が重複すると競合する可能性があるので注意して使用してください.

3. signature


この部分は、ヘッダとペイロードの符号化値を加算した後、所与の秘密鍵ハッシュで生成される.

🐣 適用


djangoを使用して、ユーザーはログイン時にaccess tokenを提供します.
# user/views.py
class LoginView(View):
    def post(self, request):
        try:
            data          = json.loads(request.body)
            user_email    = data['email']
            user_password = data['password']

            user_info = User.objects.get(email = user_email)
            
            # 아이디와 비밀번호로 유저 확인
            if bcrypt.checkpw(user_password.encode('utf-8'), user_info.password.encode('utf-8')):
            	# 사용자가 입력한 정보가 db의 정보와 일치하면 token 발행
                access_token = jwt.encode({'user_id': user_info.id}, SECRET_KEY, algorithm = 'HS256')
                return JsonResponse({'message': 'SUCCESS', 'access_token': access_token}, status = 200)
httpリクエストに基づいてトークンを発行👽
{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxMn0.u1xBwjgIykvX9SCMEXbi5_nipyadx0xRdMgzFqN2ako",
    "message": "SUCCESS"
}
リファレンス
https://velopert.com/2389