[フロントエンド]CORSの由来、特徴と用途
注意!重要文書:
ソース間リソース共有(CORS)-HSTP|MDN
あるソースから別のソースのドキュメントまたはスクリプトにインポートされるリソースとのインタラクションを制限するポリシー.デフォルトでは、同じソースからのリソースとのインタラクションのみが許可されます.
Webコンテンツにアクセスしようとするときに使用するURLのスキーマ(プロトコル)、ホスト名(ドメイン)、およびポートは「ソース」(Origin)と呼ばれます.
次の2つのURLには同じソースがあると言えます.リソースのパスは異なりますが、同じプロトコル(http)、ドメイン(example.com)、ポート番号(デフォルト80ポート)があります.(Internet Explorerはプロトコルとポート番号をチェックしません) http://example.com/app1/index.html http://example.com/app2/index.html
最近では,OpenAPIなど他のソースのURLにリソースを要求することが非常に多くなっている.同じソースの政策がネットワークの十分な利用を阻害する要因となっている.したがって,異なるソース間の相互作用はCORSの管理下で行うことができる!
例)
上記URLでは、構成元のポイントを区別する基準として「プロトコル」、「ホスト(ドメイン)」、「ポート番号」があります.
ブラウザは、セキュリティ上の理由でクロスソースのHTTPリクエストを制限します.ブラウザのWeb API XMLHttpRequestとFetch APIも同じソースポリシーに従います.したがって、他のソースからリソースを取得するには、CORSヘッダを含む応答をソースから返す必要があります.
OPTIONSメソッドは、実際のリクエストのセキュリティを確保するために、HTTPリクエストをドメイン内のリソースに送信します.このプロセスは、クライアントまたはサーバへのアクセスがユーザーデータに影響を及ぼすことを防止するために実行されます.したがって、Preflightプロシージャを使用して、サーバが許可するソースリストまたは許可する方法を決定する必要があります.単純総括ソリューション
サーバは、可能なソースのリスト(*はすべてのドメインにアクセス可能であることを示す)とリクエスト可能なメソッドのタイプを応答ヘッダに送信します.
これは、 Webブラウザで外部ドメインサーバと通信するためのHTTPヘッダに基づく標準化メカニズムである. クライアントとサーバが異なるドメイン(HTTPヘッダのソースが異なる)であるため、CORS技術が導入された. CORSは、Webブラウザが作成および実行する異なるドメインのリソースへのアクセスを可能にするセキュリティメカニズムです. でもあげますか.果たして要るのか.特定のドメインのみ許可されますか?すべてのドメイン名を許可しますか?サーバによって定義されます.(デフォルトではWebブラウザブロックを拡大・縮小しない) 交差ソースリソース共有(ソース間リソース共有)の名義で標準化されています. これは、サーバ側がクライアントにリソースの使用を許可するかどうかを決定する方法です. と同じソースでAJAXを試してみると、CORSの問題は発生しません. クライアントは、サーバがどのソースリクエストを許可するか分かりません. クライアントから要求が送信された後、サーバから受信したアクセス制御Allow-Originヘッダ属性によって接続可能かどうかを検証します.
サーバを直接制御できる場合は、 Origin:要求を送信するページソース(ドメイン) アクセスコンテンツ要求方法:実際の要求方法 アクセスコンテンツリクエストHeaders:実際のリクエストに含まれるタイトル名 .
アクセス制御Allow-origin:要求のソースを許可(*ワイルドカードはどこでも許可);必要に応じてプロトコル+ホスト+ポート番号を入力) アクセス制御-すべての資格証明:クライアントがクッキーによる資格証明を要求する場合、true、trueに応答するクライアントは、実際の要求時にサーバ定義の仕様検証値を含むクッキーを同時に送信する必要があります. アクセス-制御-拡張-リーダー:クライアント要求に含まれるカスタムヘッダ アクセス制御Max-Agene:クライアントがPreflightリクエスト結果を保存する時間を指定し、クライアントがPreflightリクエスト結果を保存する時間を指定します.この期間中、Preflightリクエストは再発行されません. アクセス制御-すべてのメソッド:要求を許可するメソッド、デフォルトはGET、POSTです.このヘッダがなければ、GETとPOSTリクエストしかできません.このヘッダが指定されている場合、クライアントがヘッダ値に対応するメソッドである場合にのみ、実際のリクエストが試行されます. アクセス制御-すべてのHeaders:要求を許可するヘッダー.
サーバを直接制御できない場合は、プロキシサーバを使用できます.CORSポリシーはブラウザが強制する方法です.サーバがブラウザに関連するヘッダーをいくつかの条件で配置すると、ブラウザはSOPを遵守し、タスクを処理しますが、プロキシサーバは処理しません.このポリシーは、サーバ間の通信では適用されないためです.
また,プロキシサーバはクライアントに応答を送信する際,要求ドメインのソースを
開発中、ローカル環境ではクライアントとサーバのポート番号が異なり、CORSの問題が発生した場合に使用する方法です.CRA環境でも開発時に利用可能です. https-proxy-ミドルウェアモジュール CRAでhttps-proxy-mriddlewareを設定する方法 SOPのポリシー リソースを同じソースに制限は実際にはSOPを遵守することが困難であるため、ブラウザはCORSポリシーによって異なるソースのドメイン間で限られたリソースインタラクションを行うことを可能にする. ブラウザは、Preflightリクエストを介してサーバに確認リクエストを送信します. ヘッダーはサーバの応答を表し、可能なソースを含む. CORSの問題は、サーバにクライアントを許可のソースとして含めることが望ましいが、サーバを制御できない環境では、プロキシサーバを使用して を解決することができる.
同一ソースポリシー→(MDN)2 CORS →(MDN) AWS-REST APIリソースCORS →(SITE)2 を有効にする COR S →(SITE) CORS Proxy →(SITE)2 の動作方法 CORSソリューション→(BLOG)2 CORSはどうして私たちをこんなに苦労させたのですか?→(SITE)
ソース間リソース共有(CORS)-HSTP|MDN
1.同じソースポリシー
あるソースから別のソースのドキュメントまたはスクリプトにインポートされるリソースとのインタラクションを制限するポリシー.デフォルトでは、同じソースからのリソースとのインタラクションのみが許可されます.
1-1. ソース(Origin)
Webコンテンツにアクセスしようとするときに使用するURLのスキーマ(プロトコル)、ホスト名(ドメイン)、およびポートは「ソース」(Origin)と呼ばれます.
次の2つのURLには同じソースがあると言えます.リソースのパスは異なりますが、同じプロトコル(http)、ドメイン(example.com)、ポート番号(デフォルト80ポート)があります.(Internet Explorerはプロトコルとポート番号をチェックしません)
1-2. 同じソースポリシーの制限
最近では,OpenAPIなど他のソースのURLにリソースを要求することが非常に多くなっている.同じソースの政策がネットワークの十分な利用を阻害する要因となっている.したがって,異なるソース間の相互作用はCORSの管理下で行うことができる!
⑨ブラウザでソースが異なると判断
例)
https://hanamon.kr:442/username/1/
例のURLについては、次のように区分できます.https
-> プロトコルhanamon.kr
-> ホスト(ドメイン):442
-> ポート番号/username/1/
-> URL pathname上記URLでは、構成元のポイントを区別する基準として「プロトコル」、「ホスト(ドメイン)」、「ポート番号」があります.
2. CORS (Cross-Origin Resource Sharing)
ブラウザは、セキュリティ上の理由でクロスソースのHTTPリクエストを制限します.ブラウザのWeb API XMLHttpRequestとFetch APIも同じソースポリシーに従います.したがって、他のソースからリソースを取得するには、CORSヘッダを含む応答をソースから返す必要があります.
2-1. Preflightリクエスト
OPTIONSメソッドは、実際のリクエストのセキュリティを確保するために、HTTPリクエストをドメイン内のリソースに送信します.このプロセスは、クライアントまたはサーバへのアクセスがユーザーデータに影響を及ぼすことを防止するために実行されます.したがって、Preflightプロシージャを使用して、サーバが許可するソースリストまたは許可する方法を決定する必要があります.
1. 미들웨어 설치 & 설정 (프론트엔드/백엔드 둘다 해당)
2. 프록시방식 사용 : 브라우저에서 프론트서버로 요청 > 프론트서버에서 백엔드서버로 요청.
프론트에서 요청 header에 Access-Control-Allow-Origin:'도메인:포트 or *(모든도메인)' 옵션 사용
要求ヘッダには、どのソースから送信されたのか、どの方法でサーバに通知されるのか、OriginとAccess Control-Request-Methodが含まれています.アクセス-制御-要求-*ヘッダーは飛行前の要求でのみ送信され、実際の要求を送信するときは含まれません.サーバは、可能なソースのリスト(*はすべてのドメインにアクセス可能であることを示す)とリクエスト可能なメソッドのタイプを応答ヘッダに送信します.
だから整理するなら?
これは、
3.CORSの解決方法
3-1. サーバによるCORSの許可
サーバを直接制御できる場合は、
Access-Control-Allow-Origin
ヘッダーでクライアント・ソースを許可するだけです.これは最も一般的な方法ですが、OpenAPIのようにサーバを直接制御できない場合は使用できません.'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Accept',
'Access-Control-Max-Age': 10
👉 Requsetヘッダ(クライアント要求ヘッダ)
👉 レスポンスヘッダ
const express = require('express');
const app = express();
app.get('/allow-cors', function(request, response) {
response.set('Access-Control-Allow-Origin', '허용 도메인');
response.sendFile(__dirname + '/message.json');
});
const listener = app.listen(process.env.PORT, function() {
console.log('Your app is listening on port ' + listener.address().port);
});
上記の方法が最も一般的ですが、サーバが応答を送信するたびにAccess-Control-Allow-Origin
ヘッダを追加するのは面倒です.Expressを使用してサーバを配備する場合は、Node.jsミドルウェアCOSを取り付けると、毎回手動でCOS関連の設定をする必要はありません.const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors({ origin: '허용 도메인' }));
3-2. プロキシサーバーの使用
サーバを直接制御できない場合は、プロキシサーバを使用できます.CORSポリシーはブラウザが強制する方法です.サーバがブラウザに関連するヘッダーをいくつかの条件で配置すると、ブラウザはSOPを遵守し、タスクを処理しますが、プロキシサーバは処理しません.このポリシーは、サーバ間の通信では適用されないためです.
また,プロキシサーバはクライアントに応答を送信する際,要求ドメインのソースを
Access-Control-Allow-Origin
のソースとするだけでCORS問題を解決できる.3-3. https-proxy-ミドルウェアライブラリのインストール
開発中、ローカル環境ではクライアントとサーバのポート番号が異なり、CORSの問題が発生した場合に使用する方法です.CRA環境でも開発時に利用可能です.
サマリ
Origin
ヘッダーはクライアントのソースを表し、Access-Control-Allow-Origin
ヘッダーはクライアントのソースを表し、リファレンス
Reference
この問題について([フロントエンド]CORSの由来、特徴と用途), 我々は、より多くの情報をここで見つけました https://velog.io/@kansun12/프론트엔드-CORSテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol