OAuth 2.0
参考:
OAuth Community Site (oauth.net)
概要
参考:
OAuth 認証を真面目に考える | DevelopersIO
OAuth 2.0 の仕組みと認証方法 | murashun.jp
多分わかりやすい OAuth | SIOS Tech. Lab
アプリ開発で知っておきたい認証技術 OAuth 1.0 + OAuth 2.0 + OpenID Connect – SlideShare
OAuth 認証
参考:
非技術者のための OAuth 認証 (?)と OpenID の違い入門 | @_Nat Zone
OpenID Connect
参考:
OpenID Connect ユースケース、OAuth 2.0 の違い・共通点まとめ | Build Insider
OAuth 2.0 + OpenID Connect のフルスクラッチ実装者が知見を語る – Qiita
OAuth2 や OpenID Connect とは何か、なんとなくわかった気になるための概要メモ | 備忘録の裏のチラシ (norikone.hatenablog.com)
ユースケース
Web アプリ
- secret (= クライアント ID に対応するパスワードなどのクレデンシャル情報) を秘匿に保てる
 - (バッチ処理など) 比較的長期間有効な API アクセス権限を必要とする場合がある
 
ネイティブアプリ (アプリ独自の Backend Server なし)
- secret を秘匿に保てない
 - 初回起動時以外はログインさせることもないので、長期間有効な API アクセス権限を必要とする
 - 端末は特定ユーザーと1対1でひも付くことが想定されるため、ユーザー認証の重要性は低い
 
ネイティブアプリ (アプリ独自の Backend Server あり)
- secret を秘匿に保てない
 - 初回起動時以外はログインさせることもないので、長期間有効な API アクセス権限を必要とする
 - バックエンド側では全ユーザーのデータを管理しているため、バックグラウンドではユーザー認証が必要
 
JS アプリ (アプリ独自の Backend Server なし)
- secret を秘匿に保てない
 - 常にユーザーがブラウザーの前にいることが期待できるため、必要に応じて API アクセス権限を再取得可能
 - ブラウザーは特定ユーザーと1対1でひも付くことが想定されるため、ユーザー認証の重要性は低い
 
JS アプリ (アプリ独自の Backend Server あり)
- secret を秘匿に保てない
 - 常にユーザーがブラウザーの前にいることが期待できるため、必要に応じて API アクセス権限を再取得可能
 - バックエンド側では全ユーザーのデータを管理しているため、バックグラウンドではユーザー認証が必要
 
参考:
OAuth 2.0 の代表的な利用パターンを仕様から理解しよう | Build Insider
クライアントタイプ | The OAuth 2.0 Authorization Framework (openid-foundation-japan.github.io)
アクセストークン
実装タイプ
- 識別子型
 - 内包型 (JWT / JSON Web Token)
 - ハイブリッド型
 
署名アルゴリズム (JWT)
- 対称鍵 (共有鍵方式)
 - 非対称鍵 (秘密鍵・公開鍵方式)
 
参考:
OAuth アクセストークンの実装に関する考察 – Qiita
認可レスポンス
- code
 - 必須 (REQUIRED). 認可コードは認可サーバーによって許可される. 漏洩のリスクを軽減するため, 認可コードは発行されてから短期間で無効にしなければならない (MUST). 認可コードの有効期限は最大でも10分を推奨する (RECOMMENDED). クライアントは2回以上認可コードを使用してはならない (MUST NOT). もし認可コードが2回以上使用された場合は, 認可サーバーはリクエストを拒否しなければならず (MUST), この認可コードを基に発行されたこれまでのすべてのトークンを無効化すべきである (SHOULD). 認可コードはクライアント識別子とリダイレクト URI に紐づく.
 - state
 - クライアントからの認可リクエストに state パラメーターが含まれていた場合は必須 (REQUIRED). クライアントから受け取った値をそのまま返す.
 
参考:
認可レスポンス | The OAuth 2.0 Authorization Protocol (openid-foundation-japan.github.io)
refresh_token
参考:
refresh_token で access_token を再発行した時の挙動について – teratail
トークン置換攻撃
参考:
単なる OAuth 2.0 を認証に使うと、車が通れるほどのどでかいセキュリティー・ホールができる | @_Nat Zone
OAuth 2.0 Implicit Flow をユーザー認証に利用する際のリスクと対策方法について | r-weblife
「OAuth 2.0 (Implicit Flow) でログイン」の被害例 | OAuth.jp
Is the OAuth 2.0 Implicit Flow Dead? | Okta Developer
CSRF 対策
参考:
クロスサイトリクエストフォージェリ | The OAuth 2.0 Authorization Protocol (openid-foundation-japan.github.io)
クリックジャッキング
参考:
クリックジャッキング | The OAuth 2.0 Authorization Protocol (openid-foundation-japan.github.io)
The OAuth 2.0 Authorization Framework
参考:
Authorization Flow
     +----------+
     | Resource |
     |   Owner  |
     |          |
     +----------+
          ^
          |
         (B)
     +----|-----+          Client Identifier      +---------------+
     |         -+----(A)-- & Redirection URI ---->|               |
     |  User-   |                                 | Authorization |
     |  Agent  -+----(B)-- User authenticates --->|     Server    |
     |          |                                 |               |
     |         -+----(C)-- Authorization Code ---<|               |
     +-|----|---+                                 +---------------+
       |    |                                         ^      v
      (A)  (C)                                        |      |
       |    |                                         |      |
       ^    v                                         |      |
     +---------+                                      |      |
     |         |>---(D)-- Authorization Code ---------'      |
     |  Client |          & Redirection URI                  |
     |         |                                             |
     |         |<---(E)----- Access Token -------------------'
     +---------+       (w/ Optional Refresh Token)
参考:
Yahoo! ID 連携 Authorization Codeフロー | Yahoo! デベロッパーネットワーク
Authorization Code Grant – RFC 6749 The OAuth 2.0 Authorization Framework | IETF (tools.ietf.org)
Implicit Flow
     +----------+
     | Resource |
     |  Owner   |
     |          |
     +----------+
          ^
          |
         (B)
     +----|-----+          Client Identifier     +---------------+
     |         -+----(A)-- & Redirection URI --->|               |
     |  User-   |                                | Authorization |
     |  Agent  -|----(B)-- User authenticates -->|     Server    |
     |          |                                |               |
     |          |<---(C)--- Redirection URI ----<|               |
     |          |          with Access Token     +---------------+
     |          |            in Fragment
     |          |                                +---------------+
     |          |----(D)--- Redirection URI ---->|   Web-Hosted  |
     |          |          without Fragment      |     Client    |
     |          |                                |    Resource   |
     |     (F)  |<---(E)------- Script ---------<|               |
     |          |                                +---------------+
     +-|--------+
       |    |
      (A)  (G) Access Token
       |    |
       ^    v
     +---------+
     |         |
     |  Client |
     |         |
     +---------+
参考:
Implicit Grant – RFC 6749 The OAuth 2.0 Authorization Framework | IETF (tools.ietf.org)
PKCE
参考:
PKCE で防げる「認可コード横取り攻撃」とはどのような攻撃か – Qiita
認可コード横取り攻撃対策のために OAuth サーバーとクライアントが実装すべきこと – Qiita
OAuth2.0 で認可コードの漏洩を防ぐ PKCE | 理系学生日記
Web API
参考:
第二弾 OAuth 2.0 + OpenID Connect のフルスクラッチ実装者が知見を語る – Qiita
Tips
参考: