14 Ekim 2019 Pazartesi

Http Cross-origin resource sharing (CORS) Parametreleri

Giriş
A sitesinden indirilen javascript kodu, B sitesindeki bir kaynağa erişmek isteyince CORS olur. Veya A sitesindeki javascript kodu B sitesindeki bir kaynağa erişmek isteyince CORS olur. CORS isteğini tarayıcı zorunlu tutar. Açıklaması şöyle
The same origin policy is enforced by the browser, not the server.
Örnek
mydomain.org sitesinden şöyle bir javascript kodu şu işlemi yapsın. Bu işlem sorunsuz çalışır
let hr = new XMLHttpRequest;
hr.open("GET", "http://mydomain.org/path");
Aynı kod şu işlemi yapsın. Bu işlem sorunsuz çalışır
hr.open("GET", "/");
Ancak bir başka siteye erişmek isterse CORS olur. Şu kod çalışmaz
hr.open("GET", "http://differentdomain.org");
Mikroservis mimarisinde CORS hemen göze çarpar. Bir çok altyapı yazılımı, CORS desteği veriyor. SpringSecurity ile CORS desteğini etkinleştirmek için SpringSecurity CorsConfigurer Sınıfı yazısına bakabilirsiniz.



CORS İsteğine Cevap
Açıklaması şöyle. Yani CORS kullanımında X-Request-Y şeklindeki isteğe, sunucu X-Allow-Y şeklinde cevap vermelidir. Eğer bu cevap gelmezse isteği başarısız kabul etme sorumluluğu istemci tarafındadır.
The CORS standard describes new HTTP headers which provide browsers and servers a way to request remote URLs only when they have permission.
Although some validation and authorization can be performed by the server, it is generally the browser's responsibility to support these headers and honor the restrictions they impose.
Örnek
Eğer B sitesi erişime izin vermiyorsa şöyle bir hata alırız.
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource
at http://localhost:8080/reset/...
(Reason:CORS header ‘Access-Control-Allow-Origin’ missing) 
Örnek
Şöyle bir hata alırız..
Error Message: Access to XMLHttpRequest at 'http://localhost:8762/binaryTree/calculateSum' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
Örnek
Şöyle bir hata alırız
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://internalIP:8080/shutdown. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://internalIP:8080/shutdown. (Reason: CORS request did not succeed).
Request headers
Bu pararametreler tarayıcı tarafından gönderilir ve preflight denilen safhada sunucuya gönderilerek bazı işlemlere izin verip vermediği sorgulanır.

Origin Alanı
A sitesinden indirilen kod, B sitesine erişmek isteyince tarayıcı B sitesine izin verip vermediğini sormak için şöyle yapar.
OPTIONS /somePage HTTP/1.1
Origin: http://siteA.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: ...
Access-Control-Request-Method Alanı
Açıklaması şöyle
CORS takes a number of additional security precautions to ensure that the server is CORS aware:
- CORS requests omit user credentials such as cookies and HTTP authentication.

- The client is limited to issuing "simple cross-origin requests," which restricts both the allowed methods (GET, POST, HEAD) and access to HTTP headers that can be sent and read by the XHR.
Örnek
Tarayıcı CORS put yapabilmek için şunu gönderir.
Access-Control-Request-Method: PUT
Access-Control-Request-Headers Alanı
Açıklaması şöyle
To enable cookies and HTTP authentication, the client must set an extra property (withCredentials) on the XHR object when making the request, and the server must also respond with an appropriate header (Access-Control-Allow-Credentials) to indicate that it is knowingly allowing the application to include private user data. 

Response headers
Access-Control-Allow-Origin
Eğer sunucu bu alanı doldurmazsa tarayıcı otomatik olarak isteği başarısız kabul eder. Açıklaması şöyle
Alternatively, if it wanted to disallow access, it could simply omit the Access-Control-Allow-Origin header, and the client’s browser would automatically fail the sent request.
Bir başka açıklama şöyle
If the third-party server is not CORS aware, then the client request will fail, as the client always verifies the presence of the opt-in header. As a special case, CORS also allows the server to return a wildcard (Access-Control-Allow-Origin: *) to indicate that it allows access from any origin. However, think twice before enabling this policy!
Örnek
B sitesindeki kaynağı herkesle paylaştığımızı belirtmek için şöyle yaparız
Access-Control-Allow-Origin: *
Örnek
B sitesindeki kaynağı sadece belli bir origin adresi ile paylaşmak için şöyle yaparız.
Access-Control-Allow-Origin: http://foo.com
Access-Control-Allow-Credentials
Açıklaması şöyle
To enable cookies and HTTP authentication, the client must set an extra property (withCredentials) on the XHR object when making the request, and the server must also respond with an appropriate header (Access-Control-Allow-Credentials) to indicate that it is knowingly allowing the application to include private user data. 
Örnek
Sunucumuzun Authorization alanı ile gelen bilgiye erişebilmesi için şöyle yaparız.
app.use(cors({origin: true, credentials: true}));
Access-Control-Expose-Headers
B sitesinin gönderdiği header alanlarına tarayıcının erişebilmesini sağlar.

Access-Control-Max-Age
Örnek ver

Access-Control-Allow-Methods
B sitesindeki izin verilen işlemleri belirtmek için şöyle yaparız.
Access-Control-Allow-Origin: http://siteA.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: ...
Access-Control-Allow-Headers
Örnek ver

Hiç yorum yok:

Yorum Gönder