-
Notifications
You must be signed in to change notification settings - Fork 0
MS_OAuth20FormPostResponseMode
- 戻る(OAuth 2.0 拡張、OpenID Connect)
- OAuth 2.0 Form Post Response Mode
- OAuth 2.0 Multiple Response Type Encoding Practices
- JWT Secured Authorization Response Mode for OAuth 2.0 (JARM)
Redirect エンドポイントへ渡る応答パラメタ群を入れる場所を
制御するためのパラメタとして、response_mode=form_post が追加された。
(OpenID Connect の登場により、
この仕様が OAuth 2.0 に追加された)。
| 値 | 応答パラメタ群の入る場所 |
|---|---|
query |
URL のクエリー部に入る(code) |
fragment |
URL のフラグメント部に入る(token) |
form_post |
200 OK + HTTP POST を自動実行する HTML に入る |
-
response_mode=form_postは、codeで使用すると、
より安全に、codeを Client の Redirect エンドポイントに送信できる。
- 新規追加されたものは、
response_mode=form_postの仕様。 -
response_mode=query,=fragmentの仕様は、
本仕様ではなく、
OAuth 2.0 Multiple Response Type Encoding Practicesで
定義されている。 - なお、セキュリティ・レベルが下がるため、デフォルトが
response_mode=fragment/=form_postなものを、
response_mode=queryに変更してはいけない(逆は OK)。
補足(なぜ
form_postが安全なのか): 3 つのモードは
**「値がどこに残るか」**が決定的に違う。
モード ブラウザ履歴 Referer ヘッダ サーバのアクセス ログ query残る 漏れうる 残る fragment残る 漏れない(サーバに送られない) 残らない form_post残らない 残らない 残らない(POST ボディ) URL に載せると、プロキシ・ログ・履歴・Referer といった
意図しない場所に認可コードやトークンが残る。
form_postは POST ボディで渡すため、これらを回避できる。なお
fragmentは「サーバに送られない」という利点がある一方、
JavaScript から読めるため、XSS があると抜かれる。
これが Implicit フローが非推奨になった理由の一つでもある
(OAuth 2.1を参照)。
通常、response_mode=form_post は response_type=code で使用するが、
以下は response_type=id_token で使用したケース。
GET /authorize?
response_type=id_token
&response_mode=form_post
&client_id=some_client
&scope=openid
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcallback
&state=DcP7csa3hMlvybERqcieLHrRzKBra
&nonce=2T1AgaeRTGTMAJyeDMN9IJbgiUG HTTP/1.1
Host: server.example.com
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Cache-Control: no-cache, no-store
Pragma: no-cache
<html>
<head><title>Submit This Form</title></head>
<body onload="javascript:document.forms[0].submit()">
<form method="post" action="https://client.example.org/callback">
<input type="hidden" name="state"
value="DcP7csa3hMlvybERqcieLHrRzKBra"/>
<input type="hidden" name="id_token"
value="eyJhbGciOiJSUzI1NiIsImtpZCI6IjEifQ.eyJzdWIiOiJqb2huIiw..."/>
</form>
</body>
</html>補足(この HTML の要点):
onloadでsubmit()を呼び、
自動的に POST させるのが仕組みの中核である。
- JavaScript が無効だと動かない(
<noscript>に手動送信ボタンを置くのが定石)。- 中間の HTML が一瞬表示されるため、
ユーザーには「白い画面が一瞬出る」ように見えることがある。- この HTML 自体に XSS があってはならない(
state等は必ずエスケープ)。
POST /callback HTTP/1.1
Host: client.example.org
Content-Type: application/x-www-form-urlencoded
id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjEifQ...&state=DcP7csa3hMlvybERqcieLHrRzKBra
補足(実装上の注意:SameSite Cookie):
form_postは
クロスサイトの POST になるため、
Client 側の Cookie(stateの照合に使うセッション Cookie など)が
SameSite=Laxでは送られない。
SameSiteクロスサイト POST で送られるか Strict送られない Lax(現在の既定)送られない(GET のトップレベル遷移のみ許可) None; Secure送られる ブラウザの既定が
Laxに変わって以降、
「急にform_postのコールバックでセッションが見つからなくなった」
という事象が起きた。
対象 Cookie をSameSite=None; Secureにする必要がある。
詳細はSameSite属性を参照。
-
Final: OAuth 2.0 Form Post Response Mode
https://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html -
OAuth & OpenID Connect 関連仕様まとめ - Qiita
https://qiita.com/TakahikoKawasaki/items/185d34814eb9f7ac7ef3
- OAuth 2.0 Multiple Response Type Encoding Practices
- JWT Secured Authorization Response Mode for OAuth 2.0 (JARM)
Tags: 移行, IT国際標準, 認証基盤, クレームベース認証, OAuth
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。