JWTを認証に使うときに知っておきたいことやテストのこと

Jun 13, 2021 13:05 · 2018 words · 5 minute read JWT Security

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_tool

総まとめ

ここまでの情報全体を総括するような記事がこちら。

セキュリティ視点からの JWT 入門

最後に

「JWTについてインプットするときに、こんなリンク集が欲しかった」という内容をまとめてみました。どなたかのお役に立てたら幸いです。

さらに踏み込んだ内容を知りたい方や実際に使ってみたい方は、こちらの本を読んでみるといいかもしれません。
Auth0、Nuxt.js、Ruby on RailsでSPA(シングルページアプリケーション)を作るという内容です。

tweet Share