0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

なにそれから学ぶCORS

Posted at

初めに

OWASPからWAFの勉強をしようと思った際、アクセス制御の不備で、早速わからないことが・・・

CORSの誤設定によって認可されていない/信用されていないオリジンからのAPIアクセスが許可されてしまう。

CORS?なにそれ?聞いたこともない・・・

CORS

ってことでCORS MDNを見てみた。

オリジン間リソース共有 (Cross-Origin Resource Sharing, CORS) は、追加の HTTP ヘッダーを使用して、あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組みです。ウェブアプリケーションは、自分とは異なるオリジン (ドメイン、プロトコル、ポート番号) にあるリソースをリクエストするとき、オリジン間 HTTP リクエストを実行します。

なるほどと言いたいところだが、ちんぷんかんぷん・・・
ということで、もう少し深堀して調べてわかったことをアウトプットします。

調べてわかったこと

CORSとは

JavaScriptからXMLHttpRequestなどを使って異なるオリジンにアクセスすること。
(ブラウザからWebAPIをキックする際に使われる技術)

オリジンとは、ドメイン、プロトコル、ポート番号のこと。

例えば、送信元がhttp://hogehoge:80/sampleだとします。
そこから下記URLに対してWebAPIをキックした際、異なるオリジン/同一オリジンの判定は以下の表のようになります。

オリジン URL
異なる http://hoge:80/sample
異なる http://hogehoge:8080/sample
異なる https://hogehoge:80/sample
同一 http://hogehoge:80/sample/list
同一 http://hogehoge:80/list

また、単純なアクセス(※1)と単純でないアクセスで、仕組みが異なります。
単純でないアクセスの場合、プリフライトと呼ばれる事前にOPTIONメソッドのリクエストを送信し、実際のリクエストを送信して問題ないか確認します。

※1 単純なアクセスは、以下のすべてを満たす場合と定義されています。

  • リクエストのHTTPメソッドがPOST、GET、HEADのいずれかになっている
  • HTTPヘッダーに、以下を含んでいる。
    Accept、Accept-Language、Content-Language、Content-Type(application/x-www-form-urlencoded
    、multipart/form-data、
    text/plainのいずれか)

処理イメージ(プリフライトあり)

プリフライトなしは、単純にサーバーにリクエスト送信してレスポンスを返すだけなので割愛。

  1. 【クライアント】実際のリクエスト前に相手側サーバーへのアクセスが可能か確認を行う(プリフライトリクエスト)
  2. 【サーバー】アクセス許可され、HTTPステータス200を返す(レスポンスに許可するHTTPメソッドなどの情報を返します)
  3. 【クライアント】アクセス許可された場合は、実際のリクエストを送信する
  4. 【サーバー】通常と同様に応答を返す

アクセス許可設定

Access-Control-Allow-CredentialsAccess-Control-Max-Ageも関連する設定ですが、今回は割愛。

Access-Control-Allow-Origin

許可するオリジンを設定します。
制限を必要としない場合、ワイルドカード(*)を設定します。

Header set Access-Control-Allow-Origin "http://hogehoge:80"
Header set Access-Control-Allow-Origin "*"

Access-Control-Allow-Method

許可するHTTPメソッド(POST、PUTなど)を指定します。

Access-Control-Allow-Headers

許可するHTTPヘッダーを指定します。

最後に

マイクロサービスが流行っている昨今なら気を付けておくべき事柄と思いました。
現職では、APIを扱う機会があまりありませんでしたが、今後の触れる機会がある技術として良い勉強になりました。
また、今回は技術を調べるだけになってしまったので、検証もやってみようと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?