89
103

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JWT アクセストークンからの個人情報漏洩

Posted at

内包型アクセストークン、典型例としては JWT アクセストークンは、関連するデータを自身の内部に持っています。下記の条件が成り立つと、論理的な帰結として、そのようなアクセストークンから直接個人情報が漏洩します。

  1. 個人情報が含まれている
  2. 暗号化されていない
  3. ステートレス
  4. 意図しない者に盗まれる

ここで「ステートレス」とは、「個人情報を保存するためのデータベースレコードを認可サーバー側に持たない」ことを意味しています。

もしもアクセストークンの実装が「内包型/暗号化されていない/ステートレス」であり、また、システムがクライアントアプリケーションに個人情報を提供する必要があるなら、当該システムは、アクセストークンに情報を埋め込むことを避け、個人情報を問い合わせるための Web API を提供すべきです。

ユーザー情報エンドポイント (OIDC Core Section 5.3) はそのような API ですが、認可サーバーが claims リクエストパラメーター (OIDC Core Section 5.5) をサポートしたければ内包型ステートレスアクセストークンは「ユーザー情報エンドポイントでどのクレーム(ユーザー属性)が要求されているか」に関する情報を含む必要があること、および、医療記録関連のクレームなどクレームによってはクレーム名の存在そのものが個人情報になりうること、について頭にとどめておいてください。

claims-from-userinfo.ja.png

もう一つの比較的新しい懸念事項はアクセストークン内の authorization_details です。

OAuth 2.0 Rich Authorization Requests (RAR) は authorization_details パラメーターを定義しています。このパラメーターは、認可リクエスト、トークンレスポンス、イントロスペクションレスポンス、JWT アクセストークンなど、さまざまな場所で使うことができます。

しかし、暗号化されていない JWT アクセストークンに埋め込むには、authorization_details の内容はあまりに詳細過ぎます。下記は RAR 仕様書から抜粋した JWT アクセストークンのペイロードの例です。この例内の authorization_details は購入履歴レコードの詳細情報を含んでいます。

authorization_details-in-jwt-access-token.ja.png

プライバシーの観点から言えば、内包型アクセストークンよりもハンドル型アクセストークンの方がはるかに良いです。しかし、なんらかの理由により、あなたのシステムでは内包型アクセストークンを使わざるをえないかもしれません。そのような場合、(a) アクセストークンを暗号化する、(b) 個人情報をアクセストークンに埋め込まない、のどちらか、もしくは両方を実施することが強く推奨されます。

アクセストークンの暗号化は想像するほど単純ではありません。詳細な議論に興味があれば『OAuth アクセストークンの実装に関する考察』をご覧ください。


本記事の英語版はこちらです→ Leakage of Personal Information via JWT Access Token

89
103
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
89
103

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?