SlideShare a Scribd company logo
1 of 56
Download to read offline
CORS 
http://cors.kojo.ru 
Константин Якушев 
MoscowJS14, 28.08.2014
http://api.ya.ru
http://api.ya.ru
http://api.ya.ru 
http://m.ya.ru?
function Fetch() 
{ 
varUrl= "http://api.ya.ru/"; 
varxhr= new XMLHttpRequest(); 
xhr.onreadystatechange= ProcessResponse; 
xhr.open("GET", Url); 
xhr.send(null); 
}
function Fetch() 
{ 
varUrl= "http://api.ya.ru/"; 
$.get(Url, ProcessResponse); 
}
http://api.ya.ru 
http://m.ya.ru 
http://api.ya.ru/m
http://api.ya.ru 
http://m.ya.ru 
http://m.ya.ru/api 
nginx
http://api.ya.ru 
http://m.ya.ru 
http://m.ya.ru/api 
nginx 
http://127.0.0.1 
http://127.0.0.1/api 
local nginx
browser 
api.ya.ru 
without 
CORS 
XHR 
m.ya.ru
browser 
GET /data 
api.ya.ru 
without 
CORS 
XHR 
m.ya.ru
browser 
GET /data 
api.ya.ru 
without 
CORS 
GET /data 
Origin: http://m.ya.ru 
XHR 
m.ya.ru
browser 
GET /data 
api.ya.ru 
without 
CORS 
GET /data 
Origin: http://m.ya.ru 
<Content> 
XHR 
m.ya.ru
browser 
GET /data 
api.ya.ru 
without 
CORS 
GET /data 
Origin: http://m.ya.ru 
<Content> 
ERROR 
XHR 
m.ya.ru
header("Access-Control-Allow-Origin: *");
Access-Control-Allow-Origin: * 
Access-Control-Allow-Origin: http://ya.ru 
Access-Control-Allow-Origin: nullAccess-Control-Allow-Origin:ya.ru, www.ruAccess-Control-Allow-Origin:http://*.ya.ru
browser 
XHR 
m.ya.ru 
api.ya.ru 
with 
CORS
browser 
XHR 
m.ya.ru 
GET /data 
api.ya.ru 
with 
CORS
browser 
XHR 
m.ya.ru 
GET /data 
GET /data 
Origin: http://m.ya.ru 
api.ya.ru 
with 
CORS
browser 
XHR 
m.ya.ru 
GET /data 
GET /data 
Origin: http://m.ya.ru 
Access-Control-Allow-Origin: * 
<Content> 
api.ya.ru 
with 
CORS
browser 
XHR 
m.ya.ru 
GET /data 
GET /data 
Origin: http://m.ya.ru 
Access-Control-Allow-Origin: * 
<Content> 
<Content> 
api.ya.ru 
with 
CORS
browser 
XHR 
m.ya.ru 
api.ya.ru 
without 
CORS
browser 
POST/new 
XHR 
m.ya.ru 
api.ya.ru 
without 
CORS
browser 
POST/new 
OPTIONS /new 
Origin: http://m.ya.ru 
Access-Control-Request-Method: POST 
XHR 
m.ya.ru 
api.ya.ru 
without 
CORS
browser 
POST/new 
OPTIONS /new 
Origin: http://m.ya.ru 
Access-Control-Request-Method: POST 
o_O 
XHR 
m.ya.ru 
api.ya.ru 
without 
CORS
browser 
POST/new 
OPTIONS /new 
Origin: http://m.ya.ru 
Access-Control-Request-Method: POST 
o_O 
<ERROR> 
XHR 
m.ya.ru 
api.ya.ru 
without 
CORS
Access-Control-Allow-Methods: * 
Access-Control-Allow-Methods: POST 
Access-Control-Allow-Methods: DELETE 
Access-Control-Allow-Methods:POST, PUTAccess-Control-Allow-Methods:P*
header("Access-Control-Allow-Origin: *"); 
if(request_is_options()) { 
header("Access-Control-Allow-Methods: POST"); 
}
browser 
XHR 
m.ya.ru 
api.ya.ru 
with 
CORS
browser 
POST/new 
XHR 
m.ya.ru 
api.ya.ru 
with 
CORS
browser 
POST/new 
OPTIONS /new 
Origin: http://m.ya.ru 
Access-Control-Request-Method: POST 
XHR 
m.ya.ru 
api.ya.ru 
with 
CORS
browser 
POST/new 
OPTIONS /new 
Origin: http://m.ya.ru 
Access-Control-Request-Method: POST 
Access-Control-Allow-Methods: POST 
XHR 
m.ya.ru 
api.ya.ru 
with 
CORS
browser 
POST/new 
OPTIONS /new 
Origin: http://m.ya.ru 
Access-Control-Request-Method: POST 
Access-Control-Allow-Methods: POST 
POST/new 
XHR 
m.ya.ru 
api.ya.ru 
with 
CORS
browser 
POST/new 
OPTIONS /new 
Origin: http://m.ya.ru 
Access-Control-Request-Method: POST 
Access-Control-Allow-Methods: POST 
POST/new 
<POST result> 
XHR 
m.ya.ru 
api.ya.ru 
with 
CORS
browser 
POST/new 
OPTIONS /new 
Origin: http://m.ya.ru 
Access-Control-Request-Method: POST 
Access-Control-Allow-Methods: POST 
POST/new 
<POST result> 
<POST result> 
XHR 
m.ya.ru 
api.ya.ru 
with 
CORS
Access-Control-Allow-Headers: * 
Access-Control-Allow-Headers: x-header 
Access-Control-Allow-Headers: x-smpl 
Access-Control-Allow-Headers:x-he, x-smplAccess-Control-Allow-Headers:x-*
Access-Control-Expose-Headers: * 
Access-Control-Expose-Headers: x-header 
Access-Control-Expose-Headers: x-smpl 
Access-Control-Expose-Headers:x-he, x-smplAccess-Control-Expose-Headers:x-*
function Add() 
{ 
varUrl= "http://api.ya.ru/new"; 
$.ajax({ 
url: Url, 
data: { name:'foo' }, 
type: 'POST', 
xhrFields: { 
withCredentials: true 
}); 
}
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Origin: *"); 
header("Access-Control-Allow-Credentials: true"); 
if(request_is_options()) { 
header("Access-Control-Allow-Methods: POST"); 
}
header("Access-Control-Allow-Origin: *"); 
header("Access-Control-Allow-Credentials: true"); 
if(request_is_options()) { 
header("Access-Control-Allow-Methods: POST"); 
}
header("Access-Control-Allow-Origin: http://m.ya.ru"); 
header("Access-Control-Allow-Credentials: true"); 
if(request_is_options()) { 
header("Access-Control-Allow-Methods: POST"); 
}
8+ 
10+
http://cors.kojo.ru 
Константин Якушев 
kojo@kojo.ru 
MoscowJS14, 28.08.2014
Бонус-трэк! XSRF и JSONP
<html><head> 
<script src="http://ya.ru/?script"></script> 
<link rel="stylesheet" href="http://ya.ru/?css"> 
</head> 
<body> 
<imgsrc="http://ya.ru/?img"> 
<form action="http://ya.ru/" method="get"> 
<input type="text" name="test"> 
<input type="submit"> 
</form> 
</body></html>
<script type="text/javascript"> 
function parseQuote(response) 
{alert(response);} 
</script> 
<script type="text/javascript" src="http://api.forismatic.com/api/1.0/?method=getQuote&format=jsonp&jsonp=parseQuote" ></script> 
Response: 
parseQuote({"quoteText":"Text", "quoteAuthor":"Author"})
http://cors.kojo.ru 
Константин Якушев 
kojo@kojo.ru 
MoscowJS14, 28.08.2014

More Related Content

Viewers also liked

Viewers also liked (6)

Cors
CorsCors
Cors
 
CORS review
CORS reviewCORS review
CORS review
 
Cross-domain requests with CORS
Cross-domain requests with CORSCross-domain requests with CORS
Cross-domain requests with CORS
 
CORS - Enable Alfresco for CORS
CORS - Enable Alfresco for CORSCORS - Enable Alfresco for CORS
CORS - Enable Alfresco for CORS
 
Cross site calls with javascript - the right way with CORS
Cross site calls with javascript - the right way with CORSCross site calls with javascript - the right way with CORS
Cross site calls with javascript - the right way with CORS
 
Cross Origin Resource Sharing
Cross Origin Resource SharingCross Origin Resource Sharing
Cross Origin Resource Sharing
 

More from MoscowJS

More from MoscowJS (20)

Александр Русаков - TypeScript 2 in action
Александр Русаков - TypeScript 2 in actionАлександр Русаков - TypeScript 2 in action
Александр Русаков - TypeScript 2 in action
 
Виктор Розаев - Как не сломать обратную совместимость в Public API
Виктор Розаев - Как не сломать обратную совместимость в Public APIВиктор Розаев - Как не сломать обратную совместимость в Public API
Виктор Розаев - Как не сломать обратную совместимость в Public API
 
Favicon на стероидах
Favicon на стероидахFavicon на стероидах
Favicon на стероидах
 
E2E-тестирование мобильных приложений
E2E-тестирование мобильных приложенийE2E-тестирование мобильных приложений
E2E-тестирование мобильных приложений
 
Reliable DOM testing with browser-monkey
Reliable DOM testing with browser-monkeyReliable DOM testing with browser-monkey
Reliable DOM testing with browser-monkey
 
Basis.js - Production Ready SPA Framework
Basis.js - Production Ready SPA FrameworkBasis.js - Production Ready SPA Framework
Basis.js - Production Ready SPA Framework
 
Контекст в React, Николай Надоричев, MoscowJS 31
Контекст в React, Николай Надоричев, MoscowJS 31Контекст в React, Николай Надоричев, MoscowJS 31
Контекст в React, Николай Надоричев, MoscowJS 31
 
Верстка Canvas, Алексей Охрименко, MoscowJS 31
Верстка Canvas, Алексей Охрименко, MoscowJS 31Верстка Canvas, Алексей Охрименко, MoscowJS 31
Верстка Canvas, Алексей Охрименко, MoscowJS 31
 
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
 
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
 
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
 
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
 
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
 
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
 
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter..."Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
 
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
 
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
 
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
 
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
 
"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27
 

CORS для тестирования и для жизни. Константин Якушев. MoscowJS 14