エンジニアしていると色々なトークンに出会うと思うのですが、今回はJWTとアクセストークンの違いがあまりはっきりしなかったので、理解するために記事にしました!
まずJWTトークンとは
JWT(Json Web Token)とは...
1.クライアントとサーバー間で情報を安全にやり取りするために使用されるJSON型のオブジェクトのトークン!
2.ペイロード内に情報を含むため、サーバー側でトークンを保持する必要がない!
JWTはヘッダー、ペイロード、署名で成り立っており、それぞれ以下の内容を定義、確認します。
ヘッダー:このスペースには、トークンのタイプと関与する署名アルゴリズムを定義します。
ペイロード:このセクションには、トークン発行者、トークンの有効期限などを定義します。
署名:安全な署名によって転送中にメッセージが変更されなかったことを確認します。
引用元:JSON Web Token(JWT)とは:特殊な形式の認証トークン
JWTのメリット、デメリット
続いてJWTのメリットです。
ステートレス認証
JWTにはトークン自体に必要な情報が含まれているため、サーバーがセッション情報を保存する必要がない。
代わりにトークンはクライアントサイドで保存されるため、アプリケーションはスケールアウトが容易になり、ステートレスなサービスが実現できる。
つまり分散システムやスケーラビリティの高いシステムに適している。
デジタル署名:
JWTはHMACやRSA署名を使って暗号化されているため、改ざんが困難。
パフォーマンス
セッション情報をサーバー側で管理する必要がないので、サーバーの負荷が減り応答時間の向上が期待できる。
拡張性
JSONベースであることから拡張が容易。必要であればJSONに新しいフィールドを追加するだけ
これに対してデメリットとしては、
サイズが大きくなる可能性
JWTは、多くの情報を含むため、トークンサイズが大きくなることがある。
特にCookieやHTTPヘッダーを通して送信する際にパフォーマンスに影響を与える可能性がある。
無効化が困難:
JWTはサーバー側で状態を保持しないため、トークンを即時無効化するのが難しい。
通常、トークンが有効期限まで使われ続けてしまうため、トークンの無効化のためにはブラックリストを実装する必要がある。
悪用のリスク
JWTが盗まれた場合、トークンの有効期限が切れるまで攻撃者がユーザーとして行動できてしまう。
HTTPSでもクライアントサイドでのトークンの扱いには注意が必要。
参考:JWT認証とは?
アクセストークンとは
特定のWebサービスを利用するために、認証局がユーザーを認証するために発行した認証情報
一般的にはOAuthで発行されるやつですね。
OAuthに関してはこちらの記事がわかりやすいですね。
引用元アクセストークンとは?-Webサービスにおけるユーザー認証-
メリット
ではアクセストークンのメリットは....
トークンの無効化が容易
アクセストークンはサーバー側でセッション情報として管理されるため、サーバー側でアクセストークンを削除するだけで即時無効化することが可能。
JWTだとブラックリスト化等の対応が必要なので、こちらは楽で良いですね
軽量
アクセストークン自体は非常に短く、ペイロードに余計なデータを含まないため、サイズが小さく、HTTPヘッダーやCookieを介して送信する際にパフォーマンス上の問題になりにくい。
セキュリティがシンプル
アクセストークンはシンプルにセッションIDのような役割を果たすので、すべてのユーザーデータや認証データはサーバー側で管理されることから、クライアント側に重要なデータが残らない。
デメリット
ステートフル
JWTと異なり、セッションの状態をサーバー側で保持する必要があるため、スケーラビリティや分散環境では管理が煩雑になる。
悪用のリスク
悪意のあるWebサービスにアクセストークンを受け渡してしまった場合に、なりすましやアカウント情報の書き換えなどのリスクがある。
JWTも同じでトークンの取り扱いには注意ってことですね
参考記事:https://logmi.jp/tech/articles/325886
まとめ
二つのメリット、デメリットをまとめるとこんな感じでしょうか!?
特徴 | JWTトークン | 通常のアクセストークン |
---|---|---|
ステート | ステートレス | ステートフル |
サイズ | 大きくなりやすい | 軽量 |
無効化 | ブラックリストが必要、即時無効化が困難 | サーバー側で簡単に無効化可能 |
セキュリティ | 署名付きで改ざん防止、ペイロードにデータ含む | トークン自体にデータは含まず、サーバー側で管理 |
スケーラビリティ | 高い(分散システムに適している) | サーバー側で状態を管理する必要あり |
ちゃんとそれぞれ特性があることを理解しないとですね〜