Giriş
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.
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");
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.
Örnek
Eğer B sitesi erişime izin vermiyorsa şöyle bir hata alırız.
Şöyle bir hata alırız..
Örnek
Şöyle bir hata alırız
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.
Açıklaması şöyle
Tarayıcı CORS put yapabilmek için şunu gönderir.
Açıklaması şöyle
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
B sitesindeki kaynağı herkesle paylaştığımızı belirtmek için şöyle yaparız
B sitesindeki kaynağı sadece belli bir origin adresi ile paylaşmak için şöyle yaparız.
Access-Control-Max-Age
Örnek ver
Access-Control-Allow-Methods
B sitesindeki izin verilen işlemleri belirtmek için şöyle yaparız.
Örnek ver
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.
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.
Şö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).Request headers
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://internalIP:8080/shutdown. (Reason: CORS request did not succeed).
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:Örnek
- 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.
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: *
ÖrnekB 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
Sunucumuzun Authorization alanı ile gelen bilgiye erişebilmesi için şöyle yaparız.
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