Co przekazesz słuchaczom?
Słuchacze zrozumieja, czym jest CORS (Cross-Origin Resource Sharing), dlaczego przegladarki blokuja niektore zadania oraz jak prawidłowo skonfigurować serwer, aby umozliwic bezpieczna komunikacje miedzy roznymi domenami.
This content is not available in your language yet.
Co przekazesz słuchaczom?
Słuchacze zrozumieja, czym jest CORS (Cross-Origin Resource Sharing), dlaczego przegladarki blokuja niektore zadania oraz jak prawidłowo skonfigurować serwer, aby umozliwic bezpieczna komunikacje miedzy roznymi domenami.
Co to jest Same-Origin?
Dwa URL-e maja to samo origin, gdy maja identyczne:
Przegladarka blokuje JavaScript przed dostepem do zasobow z innego origin że wzgledow bezpieczeństwa.
| URL A | URL B | Same Origin? |
|---|---|---|
https://example.com/page | https://example.com/api | Tak |
https://example.com | http://example.com | Nie (protokół) |
https://example.com | https://api.example.com | Nie (subdomena) |
https://example.com:443 | https://example.com:8080 | Nie (port) |
Simple Request - przegladarka od razu wysyła zadanie:
Warunki prostego requestu:
GET /api/data HTTP/1.1Host: api.example.comOrigin: https://frontend.com
---
HTTP/1.1 200 OKAccess-Control-Allow-Origin: https://frontend.comContent-Type: application/jsonPreflight Request - przegladarka najpierw pyta o pozwolenie:
Kiedy wystepuje preflight:
OPTIONS /api/data HTTP/1.1Host: api.example.comOrigin: https://frontend.comAccess-Control-Request-Method: POSTAccess-Control-Request-Headers: Content-Type, Authorization
---
HTTP/1.1 204 No ContentAccess-Control-Allow-Origin: https://frontend.comAccess-Control-Allow-Methods: GET, POST, PUT, DELETEAccess-Control-Allow-Headers: Content-Type, AuthorizationAccess-Control-Max-Age: 86400Request z credentials (cookies, auth):
Wymaga specjalnej konfiguracji po obu stronach:
credentials: 'include'Access-Control-Allow-Credentials: true* w Allow-Origin!// Frontendfetch('https://api.example.com/data', { credentials: 'include'});HTTP/1.1 200 OKAccess-Control-Allow-Origin: https://frontend.comAccess-Control-Allow-Credentials: trueResponse Headers
Access-Control-Allow-Origin - dozwolone origin(y)Access-Control-Allow-Methods - dozwolone metody HTTPAccess-Control-Allow-Headers - dozwolone nagłówkiAccess-Control-Allow-Credentials - czy cookies dozwoloneAccess-Control-Max-Age - czas cachowania preflightAccess-Control-Expose-Headers - nagłówki dostepne dla JSRequest Headers
Origin - skad pochodzi request (automatycznie)Access-Control-Request-Method - metoda do użycia (preflight)Access-Control-Request-Headers - nagłówki do użycia (preflight)Diagram pokazujacy:
Schemat sekwencyjny:
Diagram pokazujacy dwa requestty:
Screenshot z konsoli przegladarki z bledem:
Access to fetch at 'https://api.example.com/data' from origin'https://frontend.com' has been blocked by CORS policy<!-- index.html na localhost:3000 --><!DOCTYPE html><html><head><title>CORS Demo</title></head><body> <h1>CORS Test</h1> <button onclick="fetchData()">Pobierz dane</button> <pre id="result"></pre>
<script> async function fetchData() { try { // To wywoła błąd CORS jeśli serwer nie ma odpowiednich nagłówków const response = await fetch('http://localhost:8080/api/data'); const data = await response.json(); document.getElementById('result').textContent = JSON.stringify(data, null, 2); } catch (error) { document.getElementById('result').textContent = 'Błąd: ' + error.message; console.error('CORS Error:', error); } } </script></body></html><?php// api.php na localhost:8080 - PRZED (bez CORS)header('Content-Type: application/json');echo json_encode(['message' => 'Hello from API']);<?php// api.php na localhost:8080 - PO (z CORS)header('Content-Type: application/json');header('Access-Control-Allow-Origin: http://localhost:3000');
// Obsługa preflightif ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); header('Access-Control-Allow-Headers: Content-Type'); exit(0);}
echo json_encode(['message' => 'Hello from API']);Wymagania minimalne:
Wymagania rozszerzone:
* z credentials)Wymagania zaawansowane:
Pytanie 1
Dlaczego curl i Postman nie maja problemow z CORS, a przegladarka tak?
Pytanie 2
Czy ustawienie Access-Control-Allow-Origin: * jest bezpieczne? W jakich przypadkach?
Pytanie 3
Co się stanie, jeśli serwer nie obsługuje metody OPTIONS?
Pytanie 4
Jak CORS wpływa na bezpieczeństwo aplikacji webowych?
Whitelist origins
Zdefiniuj liste dozwolonych origin i sprawdzaj przychodzacy nagłówek Origin.
Ogranicz metody
Nie dawaj * - wymien tylko te metody HTTP, które naprawde potrzebujesz.
Ustaw Max-Age
Cachuj odpowiedzi preflight, aby zmniejszyc liczbe requestow OPTIONS.
Testuj w przegladarce
Postman nie testuje CORS - zawsze sprawdzaj w prawdziwej przegladarce.