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 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.