[Web Server] Browser security, CORS


Browser security
CORS

Browser security


ブラウザが脅かされているのは、JavaScriptを駆動し、多くのJavaScriptを使用できるからです.

XSS

  • クライアントがサーバを信頼していることによる問題.
  • サーバがスクリプトタグ間にコードを挿入して(スクリプト注入)ブラウザに送信すると、ブラウザはこのコードを実行します.
  • 基本的なXSS攻撃はブラウザで阻止できます.
  • CSRF

  • サーバがクライアントを信頼していることによる問題.
  • サーバは認証情報を持っていて信じています.ユーザーが認証情報としてハッカーのリンクをクリックすると、ハッカーは認証情報をキャプチャし、サーバに要求を送信します.
  • CORS


    Cross-Origin Resource Sharing
    CORSはHTTPヘッダを使用するメカニズムであり、異なるソース(サーバ)間のHTTP requistを許可する標準である.
    HTTPリクエストは基本的にサイト間HTTPリクエストが可能である.これは.<img src="other-domain.com"> ,<script src="other-domain.com/script.js">
    Webサイトが他のドメインに存在するリソース(画像、スクリプト)を参照できることを示します.
    しかし、セキュリティ上の理由から、ブラウザは<script></script>に囲まれたスクリプトによって生成されるcross-origin HTTP requestを制限している.例えば、XMLHttpRequestまたはFetch APIはSame-Originポリシーに従うため、正しいCORS Headerが含まれていない限り、他のソースに要求することはできません.
    たとえば、スクリプトを使用してユーザーを悪意のあるサイトにリダイレクトできます.ブラウザは基本的に同じソースポリシーなので、自動的にブロックされます.
    そのため,サーバ開発者はCORSを理解し,仕様に従ってHTTP要求に応答する必要がある.

    かつては1つのサイトで1台のサーバしか使用されていなかったが、現代になってAJAXの登場に伴いfront-serverが使用され、2台のサーバが使用されるようになった.CORSが必要です.

    同じサーバ上の条件

    http://mozila.org:8080プロトコル(http)、domain(mozila.org)、port(8080)が同じであれば、同じサーバ(原点).

    CORSの仕組み


    CORS規格はHTTPヘッダに新しいヘッダを追加し,サーバにその情報を利用できるサーバリストを持たせる.
    また、CORS規格では、HTTPリクエストがサーバに副作用を及ぼす場合(主にGET以外のリクエスト)にブラウザがリクエストを発行する前に「preflight」を発行するように強制しています.
    このリクエストの名前はOPTIONSで、このリクエストによってサーバにどのようなHTTPメソッドを送信することができます.
    サーバが答えを送信すると、実際のリクエストが送信されます.
    また、サーバは、クライアント要求に認証(クッキー、HTTP認証など)を含める必要があるかどうかを通知することもできる.
    サーバがリクエストを許可しない場合、エラーが送信されます.セキュリティ上の理由でJavaScriptがエラーにアクセスできません.コードからはエラーが発生したことしかわかりません.
    エラーの詳細を知りたい場合は、ブラウザのコンソールでのみ確認できます.

    CORS操作方式


    1. Simple requests


    CORS preflightリクエストが発生しないリクエストを単純リクエストと呼ぶ.以下の条件を満たすと、簡単な要求になります.
    method : GET , HEAD , POSTContent-Type : application/x-www-form-urlencoded , multipart/form-data , text/plainその他省略https://foo.exampleという名前のWebサイト(サーバ)がhttps://bar.otherという名前のサーバに要求した場合:

    サーバは応答を送信します.Access-Control-Allow-Origin: *スタイルのあるタイトル.
    上のタイトルの意味は、サーバ上のリソースがすべてのサーバで使用できることです.(*は皆さんのご希望です)
    リソースへのアクセスを制限する場合は、*の代わりにurlを使用します.

    2. Preflight requests


    preflightリクエストは、ブラウザがまずOPTIONSでリクエストを発行し、サーバにリクエストを送信できるかどうかを尋ねるものである.METHODまたはContent-Typeが上記の単純な要求条件を満たしていない場合、ブラウザは自動的にpreflight要求を発行します.
    次のMDN例では、POSTX-PINGOTHER、およびContent-Type : application/xmlの要求が送信されるので、preflight要求が最初に送信される.
    Access-Control-Allow-Origin: http://foo.example // 허용할 origin
    Access-Control-Allow-Methods: POST, GET, OPTIONS // 허용할 method
    Access-Control-Allow-Headers: X-PINGOTHER, Content-Type // 허용할 header
    Access-Control-Max-Age: 86400 
    // preflight request 를 cache 에 저장할 수 있는 시간 (단위: 초)

    3. Request w/ credentials


    later