Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
基礎からわかろうOAuth2/OpenID Connect
Search
Yuki Watanabe
June 21, 2023
Programming
540
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
基礎からわかろうOAuth2/OpenID Connect
Yuki Watanabe
June 21, 2023
More Decks by Yuki Watanabe
See All by Yuki Watanabe
【つよナレ#1】初心者こそバニラなPHPでWebアプリを作るべき
ukwhatn
0
480
15分間でふんわり理解するDocker @ Matsuriba MAX
ukwhatn
1
600
10分間でエンジニア就活について話す #ニックトレイン
ukwhatn
3
1.5k
[KC3 Meet! vol.1]ちょっとだけわかるPasskey
ukwhatn
2
500
データベース入門(数珠つなぎオンライン勉強会 #03)
ukwhatn
1
310
バックエンドロードマップ(数珠つなぎオンライン勉強会 #02)
ukwhatn
0
660
サーバ入門(概論〜Webサーバ構築)
ukwhatn
0
700
Other Decks in Programming
See All in Programming
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
210
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
570
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
240
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
200
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
160
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
340
wkhtmltopdfの次どうするか問題2026
willnet
2
1.7k
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
160
一人だけ、Kiroが静止する日
hideg
0
130
アクセシビリティから考える情報設計
high_g_engineer
0
400
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.2k
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
180
Featured
See All Featured
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
560
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
エンジニアに許された特別な時間の終わり
watany
109
250k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
440
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
Discover your Explorer Soul
emna__ayadi
2
1.3k
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
2k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
480
Embracing the Ebb and Flow
colly
88
5.2k
Transcript
基礎からわかろう OAuth2/OpenID Connect Yuki Watanabe (@ukwhatn)
SPEAKER • 渡邉 雄貴 / Yuki Watanabe ◦ 近畿大学 理工学部
B3 ▪ KINDAI Info-Tech HUB 役員 ▪ KC3運営委員会(NPO法人NxTEND) 理事 ◦ Webバックエンド・インフラエンジニア ▪ 長期インターンシップ・業務委託での開発 ▪ 転職型プログラミングスクール メンター
SPEAKER • 渡邉 雄貴 / Yuki Watanabe ◦ SKILLS ▪
Webバックエンド • Ruby(Rails) / Python(FastAPI, Flask) / Kotlin / TS ▪ Webフロントエンド • TS(React) / JS / HTML-CSS ▪ インフラ・その他 • Linux / AWS / Docker / DB / 認証・認可
SPEAKER • 渡邉 雄貴 / Yuki Watanabe ◦ SKILLS ▪
Webバックエンド • Ruby(Rails) / Python(FastAPI, Flask) / Kotlin / TS ▪ Webフロントエンド • TS(React) / JS / HTML-CSS ▪ インフラ・その他 • Linux / AWS / Docker / DB / 認証・認可
もくじ 認証・認可の違い 認証・認可警察に 見つからないための基礎知識 01 OpenID Connect OIDCはどう安全なのか? 04 OAuth2とは?
OAuth2の具体的な仕様・フロー 02 OAuth2認証 OAuth2を認証に使うということ 03
認証・認可の違い
認証ってなに? • 認証/Authentication(Authn) ◦ サービスの利用者が本人であることを確認する ▪ What you are •
生体認証 ▪ What you have • 所有物認証(カギやセキュリティキーなど) ▪ What you know • 知識認証(パスワード・秘密の質問) 認証・認可の違い
認証ってなに? • 認証/Authentication(Authn) ◦ サービスの利用者が本人であることを確認する ▪ What you are •
生体認証 ▪ What you have • 所有物認証(カギやセキュリティキーなど) ▪ What you know • 知識認証(パスワード・秘密の質問) 認証・認可の違い
認可ってなに? • 認可/Authorization(Authz) ◦ サービスの利用者に適切な権限を与える仕組み ▪ リソースへのアクセス権限・操作権限など ▪ 外部サービスに対して操作を許可することが多い •
Twitterへの代理投稿 • メールのRead/Write 認証・認可の違い
認可ってなに? • 認可/Authorization(Authz) ◦ サービスの利用者に適切な権限を与える ▪ リソースへのアクセス権限・操作権限など ▪ 外部サービスに対して操作を許可することが多い •
Twitterへの代理投稿 • メールのRead/Write 認証・認可の違い
OAuth2とは?
OAuth2とは? • OAuth2 ◦ 認可(権限委譲)のためのプロトコル ▪ ユーザのリソースへのアクセス権限を外部サービスに移譲 ▪ 外部サービスはユーザの認証情報を知る必要がない •
べんり! • 必要なだけ権限を移譲できる!
OAuth2のしくみ • 登場人物(ロール) ◦ リソースオーナー(ユーザ) ▪ GoogleやTwitterのアカウントオーナーを指す ◦ クライアント ▪
権限を移譲された外部サービス ◦ リソースサーバー ▪ だいたいWebAPIのこと リソースを提供する ◦ 認可サーバー ▪ OAuthサービスを提供するサーバー OAuth2とは?
• 登場人物 ◦ アクセストークン ▪ 「誰の」「どのリソースに」「いつまで」 アクセスできるかと紐付けられている ▪ クライアントからリソースサーバへのアクセスに添付 •
紐付けられた情報と矛盾がなければアクセスを許可 ▪ Bearerトークン(RFC6750) • アクセストークンさえ持っていれば誰でもアクセスできる OAuth2のしくみ OAuth2とは?
• 登場人物 ◦ アクセストークン ▪ スコープ • 「何の」リソースにアクセスできるかを規定 • クライアントから認可サーバへのリクエスト時に指定する
OAuth2のしくみ OAuth2とは? https://discord.com/api/oauth2/authorize?client_id=XXXXX &redirect_uri=http%3A%2F%2Fredirect:3000&response_type=code &scope=identify%20guilds
• 登場人物 ◦ リフレッシュトークン ▪ アクセストークンの再発行に利用される • 必須ではないので、発行されないこともある • 認可サーバに対して送られる
▪ 有効期限が極めて長い • 30日くらいあることもある OAuth2のしくみ OAuth2とは?
• 登場人物 ◦ 認可コード ▪ リソースオーナーが権限委譲に同意した証 ▪ 301リダイレクトによってクライアントへ送られる • クライアントは、認可コードを認可サーバに再送して
アクセストークンを要求する ▪ 有効期限が極めて短い • 仕様では10分以内を推奨 OAuth2のしくみ OAuth2とは?
• エンドポイント ◦ 認可エンドポイント ▪ 認可サーバによって提供 ▪ 認可コードの発行を行う ◦ トークンエンドポイント
▪ 認可サーバによって提供 ▪ 認可コードと引き換えにアクセストークンの発行を行う ▪ クライアントのIdentityはBasic認証で行う OAuth2のしくみ OAuth2とは?
• エンドポイント ◦ リダイレクトエンドポイント ▪ クライアントが提供する ▪ 認可コード発行時に、301リダイレクトが行われる先 OAuth2のしくみ OAuth2とは?
HTTP/1.1 301 Found Location: https://ukwhatn.com/callback?code=xxxxxxxxxx
• 事前登録 ◦ クライアントは、リダイレクトエンドポイントを 各リソース提供サービスに登録する ▪ クライアントIDとシークレットが発行される グラントにおける前提 OAuth2におけるグラントタイプ
• 事前登録 ◦ クライアントは、リダイレクトエンドポイントを 各リソース提供サービスに登録する ▪ それに対応したクライアントIDとシークレットが発行 グラントにおける前提 OAuth2におけるグラントタイプ
認可コードグラント(認可コードフロー) OAuth2におけるグラントタイプ
認可コードグラント(認可コードフロー) OAuth2におけるグラントタイプ
認可コードグラント(認可コードフロー) OAuth2におけるグラントタイプ HTTP/1.1 301 Found Location: https://ninka.example.com/authorize ?response_type=code&client_id=123456 &state=xyz&scope=identity &redirect_uri=https://client.user.com/callback
認可コードグラント(認可コードフロー) OAuth2におけるグラントタイプ
認可コードグラント(認可コードフロー) OAuth2におけるグラントタイプ
認可コードグラント(認可コードフロー) OAuth2におけるグラントタイプ HTTP/1.1 301 Found Location: https://client.user.com/callback?code=xxxxxxxxxx&state=xyz
認可コードグラント(認可コードフロー) OAuth2におけるグラントタイプ POST /token HTTP/1.1 Host: ninka.example.com Authorization: Basic <CLIENT_SECRET>
Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&code=xxx &redirect_uri=https://client.user.com/callback POST /token HTTP/1.1 Host: ninka.example.com Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&code=xxx &redirect_uri=https://client.user.com/callback &client_id=123456&client_secret=<CLIENT_SECRET>
認可コードグラント(認可コードフロー) OAuth2におけるグラントタイプ HTTP/1.1 200 OK Content-type: application/json;charset=UTF-8 Cache-Control: no-cache Pragma:
no-cache { “access_token”: “abc123”, “refresh_token”: “987zyx”, “expires_in”: 3600, “token_type”: Bearer }
認可コードグラント(認可コードフロー) OAuth2におけるグラントタイプ GET /api/user/1 HTTP/1.1 Host: resource.example.com Authorization: Bearer xyz123
Content-Type: application/x-www-form-urlencoded
クライアントコンフィデンシャルグラント (2-legged OAuth) OAuth2におけるグラントタイプ • つかえるとき ◦ クライアント全体に対してアクセス権限を発行する ◦ クライアントがコンフィデンシャルクライアントである
▪ client secretなどをセキュアに保存できるクライアント
リソースオーナーパスワードクレデンシャルグラント OAuth2におけるグラントタイプ • つかえるとき ◦ 同組織のサービス間での 認可処理
インプリシットグラント OAuth2におけるグラントタイプ
インプリシットグラント OAuth2におけるグラントタイプ
パブリッククライアントにおける認可コードグラント OAuth2におけるグラントタイプ ※ クライアントシークレットを使わないことが許可されている
認可コード横取り攻撃 OAuth2におけるグラントタイプ
認可コードグラント + PKCE • PKCE ◦ Proof Key of Code
Exchange ▪ OAuthの拡張仕様(RFC7636)で定義 OAuth2におけるグラントタイプ
認可コードグラント + PKCE • PKCE ◦ パラメータ ▪ code_verifier •
43-128文字、英数字+[“-” , ”.” , ”_” , “~”] ▪ code_challenge_method • plain(平文) or S256(SHA256) ▪ code_challenge • plainならcode_challengeそのまま • S256なら OAuth2におけるグラントタイプ BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
認可コードグラント + PKCE OAuth2におけるグラントタイプ
認可コードグラント + PKCE OAuth2におけるグラントタイプ
認可コードグラント + PKCE OAuth2におけるグラントタイプ
OAuth2を認証に使うということ
OAuth2を認証に使うということ OAuth2を認証に使う
• 2つの誤解 ◦ ① OAuth2は認証のためのものではない ▪ OAuth2では、リソースへのアクセス制御のために認証を フローの中に組み込んでいますが、 そのためのものではありません OAuth2を認証に使うということ
OAuth2を認証に使う
• 2つの誤解 ◦ ② OAuth2を認証に使っているからって なんでも危険な訳ではない ▪ OAuth2の脆弱性 インプリシットグラントの脆弱性 •
インプリシットグラントでは アクセストークンが直接ブラウザに落ちてくるため ここでの奪取やなりすましが起こりうる OAuth2を認証に使うということ OAuth2を認証に使う
• ただし ◦ 認証に使うなら、ちゃんと認証用途に標準化された OpenID Connectを使ったほうが良い ▪ でもあんまりない • Google,
Microsoft, Yahoo, Paypal, Amazon ……… • 我らがDiscordも提供していない OAuth2を認証に使うということ OAuth2を認証に使う
OpenID Connect
OpenID Connectとは? • OpenID Connect ◦ 仕組み ▪ OAuth2 +
IDトークン + UserInfoエンドポイント ◦ 用語の違い ▪ リソースオーナー -> エンドユーザー ▪ クライアント -> リライング・パーティ(RP) ▪ 認可サーバ -> IDプロパイダ ▪ リソースサーバ -> UserInfoエンドポイント OpenID Connect
認可コードフロー OpenID Connect
認可コードフロー OpenID Connect
• IDトークン ◦ IdPが発行し、RPが受け取る ◦ 形式 ▪ 署名付きJWT ◦ 内容
▪ エンドユーザの識別ID(sub) ▪ 有効期限・発行日時 ▪ 発行者ID・受領者ID ▪ トークンの形式・署名方式・署名 IDトークン OpenID Connect
• 中身 ◦ ヘッダ ▪ typクレーム:”JWT” • JWTであることを表す ▪ algクレーム:”RS256”
• 署名方式を表す • noneは禁止 • 公開鍵は特定の場所で公開(RFC7517) IDトークン OpenID Connect
• 中身 ◦ ペイロード ▪ issクレーム(issuer) • IDトークン発行者(IdPのURLなど) ◦ 正しい発行者であるかを確認
▪ audクレーム(audience) • IDトークンを受け取るRPのクライアントID ◦ 自分のIDトークンであるか(自分宛に発行されたものか)確認 IDトークン OpenID Connect
• 中身 ◦ ペイロード ▪ subクレーム(subject) • エンドユーザのuuid(識別子) ◦ RPがエンドユーザを識別するためのもの
▪ iatクレーム(issued at) • JWTの発行時間(UNIX Time (sec)) ◦ 未来の日時を指していないか確認 IDトークン OpenID Connect
• 中身 ◦ ペイロード ▪ expクレーム(expiration time) • IDトークンの有効期限 ◦
RPはこの期限以降にIDトークンを受け入れてはならない ▪ nonceクレーム • 認証リクエスト時に送ったnonceがそのまま入る ◦ IdPが認可コードと紐づけて保管 ◦ 攻撃者が認可コードをすりかえることを防ぐ IDトークン OpenID Connect
• 中身 ◦ 署名 ▪ f”{ヘッダ}.{ペイロード}”に対して Base64URLエンコード -> 署名 ->
Base64URLエンコード • ここを検証することでJWTの正当性を担保 ◦ たいへんなので各自調べてください • 認証コードフローでは省略しても良い ◦ 改ざんの可能性が限りなく低いため IDトークン OpenID Connect
• UserInfoエンドポイント ◦ ユーザの特定(認証)以外の用途で ユーザ情報を取得したいときに使う ▪ ユーザの識別情報はIDトークンのsubクレームで行う ▪ emailや住所などはこっちで取得する •
scope: openid, profile, email, address, phone • レスポンスのsubとIDトークンのsubの一致を必ず確認 UserInfoエンドポイント OpenID Connect
• インプリシットフロー ◦ パブリッククライアント向けOIDCフロー ▪ 認可コードに関する処理が省かれる • nonceによって OAuth2のインプリシットフロー脆弱性を防止 •
ハイブリッドフロー ◦ バックエンドを持つネイティブアプリ向け ▪ 認可コードとアクセストークンがアプリに送られ、 トークンは保存、認可コードはバックエンドに送られる その他のフロー OpenID Connect
まとめ OAuth認証は標準化されておらず、不便な部分も 01 OIDCは認証のためのプロトコル(標準化済) 02 OIDCの根幹はIDトークンの検証とnonceにある 03 OAuth2は認可のためのプロトコルである 04 インプリシットフロー以外は認証にも(一応)使える
05
参考資料 • The OAuth 2.0 Authorization Framework ◦ © 2012
IETF Trust, Dick Hardt ◦ https://datatracker.ietf.org/doc/html/rfc6749 • The OAuth 2.0 Authorization Framework: Bearer Token Usage ◦ © 2012 IETF Trust, Michael B. Jones, Dict Hardt ◦ https://datatracker.ietf.org/doc/html/rfc6750 • The OAuth 2.0 Threat Model and Security Considerations ◦ © 2013 IETF Trust, Torsten Lodderstedt, Mark McGloin, Phil Hunt ◦ https://datatracker.ietf.org/doc/html/rfc6750
参考資料 • OpenID Connect Core 1.0 incorporating errata set 1
◦ © 2014 The OpenID Foundation ◦ http://openid-foundation-japan.github.io/openid-connect-core-1_ 0.ja.html • OpenID Connect Implicit Client Implementer's Guide 1.0 - draft 2 ◦ © 2015 The OpenID Foundation ◦ http://openid-foundation-japan.github.io/openid-connect-implicit- 1_0.ja.html
参考資料 • 雰囲気でOAuth2.0を使っているエンジニアが OAuth2.0を整理して、手を動かしながら学べる本 ◦ © 2019 Auth屋 • OAuth、OAuth認証、OpenID
Connectの違いを整理して、 理解できる本 ◦ © 2019 Auth屋 • OAuth・OIDCへの攻撃と対策を整理して理解できる本 ◦ © 2020 Auth屋