1. JWTとは何か
▶ 概要
JWT (JSON Web Token) は、APIエンドポイントの認証やアクセス制御に利用されるトークンである。主に、クライアント・サーバー間の認証に使われ、非同期なAPI認証システムを実装するのに優れている。
JWTの重要な点として、JWT自体はトークン内の情報を暗号化するわけではなく、情報が改ざんされていないことを検証するための手段である。Base64URLでエンコードされているので、誰でもデコードすることが可能である。つまり、JWTはデータの私秉性を保証するものではないため、注意が必要である。
▶ JWTの使用ユースケース
- 認証 (Authentication)
- セッション管理 (Session Management)
- リソースアクセス制御 (Access Control)
- API間の相互認証
▶ JWTのメリット
- ステートレスでセッションを管理する必要がない
- 小さくシンプルなトークンで、URL、HTTPヘッダー、クイリーパラメータ等で送信可能
- サーバー側でトークンを検証することで、一時的にユーザーを認証可能
2. JWTの構造と仕組み
▶ JWTの構造
JWTは、3つの部分から構成される。
ヘッダー. ペイロード. 署名
1. ヘッダー (Header)
- アルゴリズム (alg): HS256, RS256など
- トークン種別 (typ): JWT
{
"alg": "HS256",
"typ": "JWT"
}
2. ペイロード (Payload)
- ユーザー情報、認証情報
- クレーム (claims):
sub
,iat
,exp
等
{
"sub": 1,
"username": "john",
"role": "admin",
"iat": 1672376000,
"exp": 1672379600
}
3. アクセストークンとリフレッシュトークン
▶ アクセストークンの役割
- APIにアクセスする際に毎回送信され、リソースへのアクセスを許可する。
- 短期間で失効する (例: 15分)。
▶ リフレッシュトークンの役割
- アクセストークンが期限切れになった際に、新しいアクセストークンを発行するために使われる。
- 長期間有効 (例: 7日)。
▶ 両者の違いと使い分けのポイント
- アクセストークンは短期間で失効し、リフレッシュトークンが新しいアクセストークンを再発行する。
- アクセストークンは攻撃者に盗まれても影響が限定的であるが、リフレッシュトークンは厳重に保管する必要がある。
▶ アクセストークンが短期である理由
- 万が一漏洩した場合の被害を最小限に抑えるため。
- 一定期間ごとにトークンを更新することでセキュリティを高める。
4. HS256とRS256の違い
▶ HS256とRS256の違いを表で整理
特徴 | HS256 | RS256 |
---|---|---|
暗号方式 | 対称暗号方式 | 非対称暗号方式 |
鍵の種類 | 1つの秘密鍵 | 秘密鍵と公開鍵 |
セキュリティ | 比較的低い | 高い |
処理速度 | 速い | 遅い |
使用場面 | 内部API | 公開API |
▶ HS256の仕組みと特徴
- 1つの秘密鍵を使って署名と検証を行う。
- シンプルで高速であるが、秘密鍵が漏れるとトークンが偽造されるリスクがある。
▶ RS256の仕組みと特徴
- 秘密鍵で署名し、公開鍵で検証する。
- 非対称暗号方式であり、公開鍵を安全に共有できるため、セキュリティが高い。
▶ メリット・デメリット
- HS256は処理が速くシンプルであるが、セキュリティ面で劣る。
- RS256はセキュリティが高いものの、処理が遅く管理が複雑になる。
▶ どちらを使うべきか?ユースケースごとの選び方
- HS256: 内部APIや、サーバーサイドだけで完結するシステム。
- RS256: 公開APIや、多数のクライアントが関わるシステム。
5. セキュリティの注意点とベストプラクティス
- JWTの中身は暗号化されていない (誰でもデコード可能)。
- HTTPSを使うことで、トークンの盗聴を防ぐ。
- トークンの有効期限は短く設定し、長期間のアクセスはリフレッシュトークンで管理する。
- リフレッシュトークンはHttpOnly Cookieで安全に保管する。
- ブラックリストを導入し、特定のトークンを失効させる仕組みを作る。
6. まとめと今後の学習メモ
▶ 学んだポイントの振り返り
- JWTの基本構造と認証の流れを理解。
- HS256は対称暗号でシンプル、RS256は非対称暗号でセキュア。
- アクセストークンとリフレッシュトークンの使い分けが重要。
▶ 今後調べたいことや深掘りしたいトピック
- JWE (JSON Web Encryption): トークン自体を暗号化する仕組み。
- JWS (JSON Web Signature): 署名だけを行う仕組み。
- トークンのスコープ管理や細かいアクセス制御方法。