JWTとは? アクセストークンとの違い。両者のメリット、デメリット

エンジニアしていると色々なトークンに出会うと思うのですが、今回はJWTとアクセストークンの違いがあまりはっきりしなかったので、理解するために記事にしました！

# まずJWTトークンとは

JWT(Json Web Token)とは...

1.クライアントとサーバー間で情報を安全にやり取りするために使用されるJSON型のオブジェクトのトークン!
2.ペイロード内に情報を含むため、サーバー側でトークンを保持する必要がない！

JWTはヘッダー、ペイロード、署名で成り立っており、それぞれ以下の内容を定義、確認します。

>   ヘッダー：このスペースには、トークンのタイプと関与する署名アルゴリズムを定義します。
    ペイロード：このセクションには、トークン発行者、トークンの有効期限などを定義します。
    署名：安全な署名によって転送中にメッセージが変更されなかったことを確認します。


引用元：[JSON Web Token（JWT）とは：特殊な形式の認証トークン](https://www.okta.com/jp/identity-101/what-is-token-based-authentication/#:~:text=JSON%20Web%20Token%EF%BC%88JWT%EF%BC%89%E3%81%A8,%E3%81%AA%E5%BD%A2%E5%BC%8F%E3%81%AE%E8%AA%8D%E8%A8%BC%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3&text=JWT%E3%82%92%E8%A3%BD%E5%93%81%E3%81%AB%E4%BD%BF%E7%94%A8,%E9%87%8D%E8%A6%81%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)


## JWTのメリット、デメリット

続いてJWTのメリットです。

### ステートレス認証
JWTにはトークン自体に必要な情報が含まれているため、サーバーがセッション情報を保存する必要がない。
代わりにトークンはクライアントサイドで保存されるため、アプリケーションはスケールアウトが容易になり、ステートレスなサービスが実現できる。
つまり分散システムやスケーラビリティの高いシステムに適している。


### デジタル署名: 
JWTはHMACやRSA署名を使って暗号化されているため、改ざんが困難。

### パフォーマンス
セッション情報をサーバー側で管理する必要がないので、サーバーの負荷が減り応答時間の向上が期待できる。

### 拡張性
JSONベースであることから拡張が容易。必要であればJSONに新しいフィールドを追加するだけ


<br>
これに対してデメリットとしては、

### サイズが大きくなる可能性
JWTは、多くの情報を含むため、トークンサイズが大きくなることがある。
特にCookieやHTTPヘッダーを通して送信する際にパフォーマンスに影響を与える可能性がある。

### 無効化が困難: 
JWTはサーバー側で状態を保持しないため、トークンを即時無効化するのが難しい。
通常、トークンが有効期限まで使われ続けてしまうため、トークンの無効化のためにはブラックリストを実装する必要がある。

### 悪用のリスク
JWTが盗まれた場合、トークンの有効期限が切れるまで攻撃者がユーザーとして行動できてしまう。
HTTPSでもクライアントサイドでのトークンの扱いには注意が必要。


参考：[JWT認証とは？](https://zenn.dev/shtk0119/articles/14a6a9ef1eb1fe)



# アクセストークンとは

> 特定のWebサービスを利用するために、認証局がユーザーを認証するために発行した認証情報

一般的にはOAuthで発行されるやつですね。

OAuthに関してはこちらの記事がわかりやすいですね。


https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be

引用元[アクセストークンとは？－Webサービスにおけるユーザー認証－](https://n.career-info.jp/contents/?id=10161)


## メリット
ではアクセストークンのメリットは....


### トークンの無効化が容易
アクセストークンはサーバー側でセッション情報として管理されるため、サーバー側でアクセストークンを削除するだけで即時無効化することが可能。
JWTだとブラックリスト化等の対応が必要なので、こちらは楽で良いですね

### 軽量
アクセストークン自体は非常に短く、ペイロードに余計なデータを含まないため、サイズが小さく、HTTPヘッダーやCookieを介して送信する際にパフォーマンス上の問題になりにくい。

### セキュリティがシンプル
アクセストークンはシンプルにセッションIDのような役割を果たすので、すべてのユーザーデータや認証データはサーバー側で管理されることから、クライアント側に重要なデータが残らない。


## デメリット

### ステートフル
JWTと異なり、セッションの状態をサーバー側で保持する必要があるため、スケーラビリティや分散環境では管理が煩雑になる。

### 悪用のリスク
悪意のあるWebサービスにアクセストークンを受け渡してしまった場合に、なりすましやアカウント情報の書き換えなどのリスクがある。
JWTも同じでトークンの取り扱いには注意ってことですね


参考記事：https://logmi.jp/tech/articles/325886


 # まとめ
二つのメリット、デメリットをまとめるとこんな感じでしょうか！？

| **特徴**              | **JWTトークン**                                  | **通常のアクセストークン**                     |
|-----------------------|-------------------------------------------------|------------------------------------------------|
| **ステート**           | ステートレス                                     | ステートフル                                    |
| **サイズ**             | 大きくなりやすい                                 | 軽量                                           |
| **無効化**             | ブラックリストが必要、即時無効化が困難           | サーバー側で簡単に無効化可能                    |
| **セキュリティ**       | 署名付きで改ざん防止、ペイロードにデータ含む     | トークン自体にデータは含まず、サーバー側で管理 |
| **スケーラビリティ**   | 高い（分散システムに適している）                 | サーバー側で状態を管理する必要あり             |


ちゃんとそれぞれ特性があることを理解しないとですね〜