CORSメモ
XHR2
送信側
JS:
var xhr2 = new XMLHttpRequest(); xhr2.open("GET", "https://api.example.jp/xhr/"); xhr2.setRequestHeader("X-CSRF-Token", "r4nd0MStr1ng"); xhr2.withCredentials = "true"; xhr2.send
同一OriginでもXSSが無いとも限らないから付けとけば安心かな。
HTTP Request Header:
GET http://api.example.jp/xhr HTTP/1.1 X-CSRF-Token: r4nd0MStr1ng Origin: http://example.jp Cookie: session=hutsunosessionid
受信側
HTTP Response Header:
HTTP/1.1 200 OK Access-Control-Allow-Origin: http://example.jp Access-Control-Allow-Credentials: true
WebSocket
var ws = new WebSocket("wss://api.example.jp"); ws.send("msg");
GET https://api.example.jp/ HTTP/1.1 Upgrade: websocket Connection: Upgrade Host: api.example.jp Origin: https://example.jp Sec-WebSocket-Key: c2Vjd2Vic29ja2V0a2V5ZGF5bw==
必ずサーバ側でOriginヘッダを検証する。 ※ホスト名は完全一致で検証する。さもないとサブドメインとか@とかで抜けられる。
- 備考:AngularJSの$httpでカスタムヘッダを付けて送る方法
myModule.config(function($httpProvider) { $httpProvider.defaults.headers.common['X-CSRF-Token'] = 'r4nd0MStr1ng'; });
- SockJS socket management service