こう 聞かれます
- 「OAuth 2.0 の
認可コードフローを 説明してください」 - 「PKCE は
何を 防ぐ ための 仕組みですか」 - 「スマホアプリや SPA では、
なぜ PKCE が 要るのですか」
面接官が 見ている点
- 認可コードと
アクセストークンを 分けて 受け取る 理由を言えるか - PKCE が
「コードの横取り」を 防ぐ 仕組みだと、 手順で 説明できるか - 秘密の
値を 隠せる アプリと、 隠せない アプリの 違いを 分かっているか
短い答え
- 認可コードフローは、
利用者が 許可した あとに 短い 「認可コード」を 受け取り、 それを トークンの 窓口で アクセストークンに 換える 流れです。 - PKCE は、
アプリが 毎回作る 使い捨ての 合言葉で、 途中で 認可コードを 盗まれても、 合言葉を 知らない 相手は トークンに 換えられないようにします。 - スマホアプリや SPA のように
秘密の 値を 隠せない アプリでは、 PKCE を 必ず 使います。 サーバー側の アプリにも 勧められています。
少し 詳しい答え
認可コードフローの流れ
OAuth 2.0 は、
- アプリが
利用者を、 認可サーバー (許可を 出す側) の 画面へ送ります - 利用者が
ログインして 許可すると、 アプリの 戻り先に 認可コードが 付いて返ります - アプリは
認可コードを トークンの 窓口へ 送り、 アクセストークンを 受け取ります - アプリは
アクセストークンを 付けて API を呼びます
認可コードは
PKCE の仕組み
PKCE (ピクシー) は、code_verifier をcode_challenge としてcode_verifier を
1. 認可の要求 (GET /authorize)
response_type=code
client_id=app1
code_challenge=<code_verifier のハッシュ>
code_challenge_method=S256
2. トークンの交換 (POST /token)
grant_type=authorization_code
code=<受け取った認可コード>
code_verifier=<最初に作った元の値>途中でcode_verifier は
OAuth の
インプリシットフローとの違い
昔は SPA 向けに、
トレードオフ
自分で OAuth の
よく ある間違い
- OAuth を
ログインの 仕組み その ものだと言う OAuth は 「許可を渡す」 決まりです。 ログインした 人が 誰かを 確かめる 部分は、 その上に OpenID Connect などを重ねます - PKCE を
スマホアプリだけの物と言う SPA にも 要りますし、 サーバー側の アプリにも 勧められています - SPA では
インプリシットフローを 使うと言う 今は 勧められていません。 認可コードフローと PKCE を使います
深掘りの問い
- 「state は
何の ために 付けますか」 戻ってきた 応答が、 自分が 出した 要求への 返事かを 確かめ、 CSRF (利用者に 意図しない 要求を 送らせる 攻撃) を 防ぐ ためと答えます - 「アクセストークンは
どこに 置きますか」 ブラウザの JavaScript から 読める 場所に 長く 置くと、 XSS で 盗まれやすいことに 触れ、 寿命を 短く する、 サーバー側で 持つ、 などの 手を挙げます - 「リフレッシュトークンとは
何ですか」 短命の アクセストークンを 取り直すための 長めの トークンで、 漏れた ときの 害が 大きいので 扱いを 厳しく する、と答えます