Skip to content

Instantly share code, notes, and snippets.

@xl1
Created June 7, 2016 15:59
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xl1/fe231826774b15eecc40ef1e69845c6b to your computer and use it in GitHub Desktop.
Save xl1/fe231826774b15eecc40ef1e69845c6b to your computer and use it in GitHub Desktop.
JSON Web Token を失効させる

JSON Web Token を失効させる

JWT いいけど、個別に失効させようとすると面倒だと思う。 JWT の利点の一つとして、発行者以外でも自由にトークンの有効性を検証できるというのがあるはずだけど、 「期限切れ」以外の失効がある可能性を考えるとうまくいかない。 失効したという事実を中央集権的にどこかで保持する必要がでてきてしまう

1. 失効したトークンをブラックリストに持つ

単純な方法、トークンに有効期限を設けておけば、ブラックリストが無限に大きくなることはない

そもそも元のトークンがないときはブラックリストに入れることができない。 「ログアウト」操作をしたときにリストに追加して失効させる、というような場合はよいが、遠隔ログアウトみたいなことはできない。 するならこれまで発行した有効なトークンをすべてデータベースかどこかに保存しておかなければならず、 JWT の利点がかなり削がれる感はある

2. 失効情報の一部をデータベースに持つ

たいていの場合は「ある時点で」「特定のユーザーの」トークンをすべて無効化したいというケースが多くて、 個別に一つひとつ制御したいということはあまりないはず。 その場合は例えば「ユーザー識別子」と「失効日時」だけを保存しておいて、 それより前に発行されたものを無効と扱うようにすればよい。 クレームに含まれるものなら何でも条件にできて、条件を満たすトークンを一気に無効化できるので便利だと思う。

有効性判定にロジックが含まれることになるので、多数のシステムで個別に検証するような仕組みにしてる場合は、 一貫性を保ちにくくなるかもしれない

3. そもそも有効期限を短くしておく

例えば最大 5 分で失効するなら、いちいち個別のトークンの有効性を管理する必要は薄いでしょう

4.

なんか思いついたけど忘れた

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment