CORS は、他のドメイン(例:myothersite.com)で提供されるページ上のブラウザスクリプトが、あなたのサーバー(例:api.mysite.com)と通信できるようにするメカニズムです。JSONP と同様に、CORSの目的は同一オリジンポリシーを回避し、Sailsサーバーが他のドメインでホストされているページ上で実行されているクライアントサイドJavaScriptコードからのリクエストに正常に応答できるようにすることです。JSONPとは異なり、GETリクエスト以外にも対応しており、特定のオリジン(`staging.yoursite.com`や`yourothersite.net`)をホワイトリストに登録し、他のオリジン(`evil.com`)からのリクエストをブロックできます。
Sailsは、指定したドメインリストからのクロスオリジンリクエスト、またはすべてのドメインからのクロスオリジンリクエストを許可するように設定できます。これは、ルートごとに、またはアプリケーションのすべてのルートに対してグローバルに行うことができます。
セキュリティ上の理由から、SailsではCORSはデフォルトで無効になっています。しかし、有効化は簡単です。
アプリケーション内のすべてのルートに対して、信頼できるドメインのホワイトリストからのクロスオリジンリクエストを許可するには、config/security.js
でallRoutes
を有効化し、origin
設定を指定します。
cors: {
allRoutes: true,
allowOrigins: ['http://example.com','https://api.example.com','http://blog.example.com:1337','https://foo.com:8888']
}
アプリケーション内のすべてのルートに対して、すべてのドメインからのクロスオリジンリクエストを許可するには、allowOrigins: '*'
を使用します。
cors: {
allRoutes: true,
allowOrigins: '*',
allowCredentials: false
}
allowOrigins: '*'
を使用する場合、allowCredentials
設定は必ずfalse
にする必要があります。つまり、Cookieを含むリクエストはブロックされます。この制限は、サードパーティサイトがログイン中のユーザーをだまして、アプリケーションへの不正なリクエストを行わせないようにするためのものです。この制限を解除することもできます(自己責任で!)が、その場合はallowAnyOriginWithCredentialsUnsafe
設定を使用します。
使用可能なすべてのオプションの詳細については、sails.config.security.cors
を参照してください。
config/security.js
のグローバルなCORS設定に加えて、これらの設定はconfig/routes.js
でルートごとに設定できます。
config/security.js
でallRoutes: true
を設定した場合でも、特定のルートを例外とするには、そのルートのターゲットでcors: false
を設定します。
'POST /signup': {
action: 'user/signup',
cors: false
}
特定のルートに対してグローバルなCORS設定を有効化またはオーバーライドするには、辞書としてcors
を指定します。
'GET /videos': {
action: 'video/find',
cors: {
allowOrigins: ['http://example.com','https://api.example.com','http://blog.example.com:1337','https://foo.com:8888'],
allowCredentials: false
}
}
- CORSサポートはHTTPリクエストにのみ関連します。ソケットを介して行われたリクエストは、クロスオリジン制限の対象になりません。ソケットを介してアプリケーションを安全にするには、
onlyAllowOrigins
設定(通常はconfig/env/production.js
内)を設定します。- Internet Explorer 7ではCORSはサポートされていません。幸いなことに、IE8以降、およびその他のすべての最新のブラウザではサポートされています。
- MDNのCORSに関する詳細はこちら。
- CORS仕様書はこちら。