JWTを認証に使うときに知っておきたいことやテストのこと
Jun 13, 2021 13:05 · 2018 words · 5 minute read
JWTを使うシステムに関わる機会があったので、色々な記事で必要となる情報をインプットしました。
この記事では、「JWTデビューするにあたって、こんなリンク集が欲しかった」という情報をまとめてみました。
目次
JWTとは?
JWTはJSON Web Tokensの略で、Webアプリの認証認可などに使われています。
[Base64(HEADER)].[Base64(PAYLOAD)].[Base64(SIGNATURE)]
という形式で構成されており、Base64でデコードすることで内容を確認することができます。
例
Header
{
"alg": "RS256",
"kid": "{kid}",
"typ": "JWT"
}
Payload
{
"aud": ["{aud}"],
"email": "admin@example.com",
"exp": 1519418215,
"iat": 1519331815,
"iss": "https://example.com",
"nonce": "{nonce}",
"sub": "{sub}"
}
読み方
「The suggested pronunciation of JWT is the same as the English word “jot”.」 らしいので、日本語で書くと「ジョット」でしょうか。
参照リンク
RFC 7519 JSON Web Token (JWT)
仕様
JWT周辺には多くの仕様があります。
- JSON Web Signature (JWS)
- JSON Web Key (JWK)
- JSON Web Token (JWT)
- JSON Web Encryption (JWE)
- JSON Web Key (JWK)
などなど
メリット
- JSON形式の構造化されたデータをやり取りできる
- 署名(JSON Web Signature, JWS)や暗号化(JSON Web Encryption, JWE )に関する仕様がある
- 各種言語やフレームワークで使うためのライブラリが豊富
参照リンク
デメリット
- 含まれるデータが利用者の手元にある(悪意のある人の手元にもある)
- 機能が多いので、その分気をつけないといけないことも増える(鍵の管理とか)
参照リンク
JWTを使って実装するときに知っておきたいこと
OWASPの資料に「JWTを使った実装をするにあたって、どんなことを気をつけないといけないのか」がまとめられています。
参照リンク
JSON Web Token Cheat Sheet for Java
データを保管する場所
「JTWのデータをどこに保管するべきか」は意見が分かれるところです。
JWTのデータサイズや利用用途の問題でCookieではなくLocal StorageやSession Storageに保管される場合があります。
Local StorageやSession StorageはJavaScriptからアクセスすることができ、CookieのようにHttpOnlyやSecure属性が使えません。
そのことから、「Local StorageやSession StorageにJWTのデータを置くのは危険だ!」というのが一方の意見のようです。
参照リンク
JWTは使うべきではない 〜 SPAにおける本当にセキュアな認証方式 〜
もう一方の意見は、このようなものです。
JWTやCookieに保管しているセッションIDのような情報は、盗むことそのものが目的ではなく、攻撃対象のシステムで悪用することが目的。
ということで、CookieでHttpOnlyやSecureの属性を設定していたとしても、XSSやCSRFなどで強制的にリクエストを送信させれば関係ないのでは?
参照リンク
おーい磯野ー,Local StorageにJWT保存しようぜ!
AndroidやiOSのようなスマホ端末の場合は、KeychainやEncryptedSharedPreferencesのようなOSが提供するセキュリティ機構を使う手もあります。
しかし、Webブラウザの場合はそうもいきません。
「実現したい機能」と「そのために利用したいライブラリやサービス」、そして「リスクをどこまで許容できるのか」といったところを天秤にかけつつ、実装方法や仕様を検討する必要がありそうです。
JWTをテストするときに知っておきたいこと
JWTを使ったシステムをテストするときに知っておきたい内容です。
裏を返すと、「これらを知った上で実装しておきたい」という内容になっています。
「どんなテストをするのか?」という全体の雰囲気を掴むには、こちらの記事わかりやすかったです。
こちらの記事では、テストで試したい内容が網羅的に記載されていました。
解説動画もあります。
テストをするときに便利なツールがこちら。
総まとめ
ここまでの情報全体を総括するような記事がこちら。
最後に
「JWTについてインプットするときに、こんなリンク集が欲しかった」という内容をまとめてみました。どなたかのお役に立てたら幸いです。
さらに踏み込んだ内容を知りたい方や実際に使ってみたい方は、こちらの本を読んでみるといいかもしれません。
Auth0、Nuxt.js、Ruby on RailsでSPA(シングルページアプリケーション)を作るという内容です。