Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
CORS完全に理解した(したい)
Search
toshi00
August 28, 2023
Programming
0
3
CORS完全に理解した(したい)
CORSについて簡単に紹介する資料です
https://github.com/toshi-pono/CORS-practice
toshi00
August 28, 2023
Tweet
Share
More Decks by toshi00
See All by toshi00
aiotraQで爆速BOT開発!
toshi00
0
17
Rustで エンジニアは絶対に使えない「TypoIME」を作ろう
toshi00
0
670
JtagAdapter制作記 seccamp2021 X-2 / jtagAdapter
toshi00
0
150
Other Decks in Programming
See All in Programming
Webの外へ飛び出せ NativePHPが切り拓くPHPの未来
takuyakatsusa
2
360
PHPでWebSocketサーバーを実装しよう2025
kubotak
0
160
Haskell でアルゴリズムを抽象化する / 関数型言語で競技プログラミング
naoya
17
4.9k
XP, Testing and ninja testing
m_seki
3
190
Team operations that are not burdened by SRE
kazatohiei
1
210
なんとなくわかった気になるブロックテーマ入門/contents.nagoya 2025 6.28
chiilog
1
210
童醫院敏捷轉型的實踐經驗
cclai999
0
190
Cline指示通りに動かない? AI小説エージェントで学ぶ指示書の書き方と自動アップデートの仕組み
kamomeashizawa
1
580
WindowInsetsだってテストしたい
ryunen344
1
190
「ElixirでIoT!!」のこれまでとこれから
takasehideki
0
370
生成AIで日々のエラー調査を進めたい
yuyaabo
0
650
アンドパッドの Go 勉強会「 gopher 会」とその内容の紹介
andpad
0
260
Featured
See All Featured
A better future with KSS
kneath
239
17k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.5k
For a Future-Friendly Web
brad_frost
179
9.8k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
17
940
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
700
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.3k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
RailsConf 2023
tenderlove
30
1.1k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Transcript
CORS完全に理解した(したい) @toshi00_p 2023.08.28
今⽇やること たまによくあるエラー CORSでブロックされた!ってときに何が起きてるか ちょっとだけ理解する CORSと仲良く開発しよう! 2/17
今⽇やること CORS:オリジン間リソース共有 1. オリジンとは? 2. CORSの仕組み 3. CORSの必要性 扱わないこと •
プリフライトリクエスト • HTMLタグ内でのリクエスト(img, iframe, canvasなど) • Cookie 3/17
CORS = オリジン間リソース共有、 Cross-Origin Resource Sharing 4/17 CORSとは クロスオリジンのときに
リソースを使えるようにする サーバーからブラウザへの許可 APIリクエストと そのレスポンス オリジンが違う 同⼀オリジンのリクエストは常に許可 クロスオリジンのリクエストは基本は禁⽌ → (でもアクセスしたい)→ CORSで個別に許可 許可に応じて ブラウザが制御
CORS = オリジン間リソース共有、 Cross-Origin Resource Sharing 5/17 CORSとは クロスオリジンのときに
リソースを使えるようにする サーバーからブラウザへの許可 APIリクエストと そのレスポンス オリジンが違う 同⼀オリジンのリクエストは常に許可 クロスオリジンのリクエストは基本は禁⽌ → (でもアクセスしたい)→ CORSで個別に許可 許可に応じて ブラウザが制御
1. クロスオリジン? 6/17 オリジンとは https://example.com:443 host name port scheme リクエスト元
リクエスト先 https://example.com https://example.com same-origin: 完全一致 https://dev.example.com cross-origin: サブドメイン https://example.com:8080 cross-origin: 異なるポート オリジン = スキーム(プロトコル) + ホスト名 + ポート
1. クロスオリジン? 7/17 (おまけ) origin と site 対象:https://example.com same-origin same-site
same-site かどうかは cookie の送信で関係してくる same-site: eTLD+1が同じ(雑に書くと、ドメインの持ち主が同⼀) https://example.com https://example.com:443 https://github.com https://google.com http://example.com https://dev.example.com https://example.com:8080
CORS = オリジン間リソース共有、 Cross-Origin Resource Sharing 8/17 CORSとは クロスオリジンのときに
リソースを使えるようにする サーバーからブラウザへの許可 APIリクエストと そのレスポンス オリジンが違う 同⼀オリジンのリクエストは常に許可 クロスオリジンのリクエストは基本は禁⽌ → (でもアクセスしたい)→ CORSで個別に許可 許可に応じて ブラウザが制御
2. CORSの仕組み 9/17 JSエンジン*¹ ブラウザ サーバー *1: 実際には、JSエンジンはブラウザの内部に組み込まれている *2: 単純リクエストでない場合は、許可がなければリクエストも送信しない
リクエストの送信を要求 レスポンス 許可されて いなければ 破棄 レスポンス リクエストを送信*² フロントエンド開発 バックエンド開発
2. CORSの仕組み 10/17 CORSのヘッダー ※ 許可の申請(クライアントからサーバー)はブラウザが自動でやってくれる。FE側でやることは特にない。 許可(サーバーからクライアント) • Access-Control-Allow-Origin •
Access-Control-Allow-Credentials • Access-Control-Allow-Headers • Access-Control-Allow-Methods • Access-Control-Expose-Headers • Access-Control-Max-Age 許可の申請(クライアントからサーバー※) • Origin • Access-Control-Request-Headers • Access-Control-Request-Method
2. CORSの仕組み(許可の例) 11/17 Access-Control-Allow-Origin JSエンジン JSエンジン https://site.example https://evil.example https://api.example Access-Control-Allow-Origin:
https://site.example 許可したオリジンのみレスポンスを取得できる
2. CORSの仕組み(許可の例) 12/17 Access-Control-Expose-Headers JSエンジン JSエンジン https://site.example https://site.example https://api.example Access-Control-Expose-Headers:
Myheader CORSセーフリストレスポンスヘッダーは、許可なしに取得できる (Cache-Control, Content-Length, Content-Language, Content-Type, Expires, Last-Modified, Pragma) Myheader: hogehoge Myheader: undefined 許可あり 許可なし
3. CORSの必要性 13/17 CSRF脆弱性 今回のケースはCookieの設定も良くない……かも なお、CORSだけでは防げないパターンもあるので注意が必要 https://api.example https://site.example https://evil.example ログイン:
Cookieがapi.exampleに 対して付与 ①ログイン ②アクセス ③勝手に リクエスト ④レスポンス ⑤レスポンスを覗 き見 CORSがないので リクエストできる
CORS = オリジン間リソース共有、 Cross-Origin Resource Sharing 14/17 CORSとは クロスオリジンのときに
リソースを使えるようにする サーバーからブラウザへの許可 APIリクエストと そのレスポンス オリジンが違う 同⼀オリジンのリクエストは常に許可 クロスオリジンのリクエストは基本は禁⽌ → (でもアクセスしたい)→ CORSで個別に許可 許可に応じて ブラウザが制御
終わりに CORSで重要なポイント Origin Access-Controll-Allow-Origin 単純リクエスト プリフライトリクエスト CORS完全に理解した!(わからん) 15/17
参考 • オリジン間リソース共有 (CORS) https://developer.mozilla.org/ja/docs/Web/HTTP/CORS • フロントエンド開発のためのセキュリティ⼊⾨ 16/17