CORS (Cross-Origin Resource Sharing) là cơ chế browser bắt server xác nhận đồng ý trước khi cho domain khác gọi API.
- Khi SPA ở
app.example.comfetch tớiapi.example.com, browser sẽ gửi preflightOPTIONSrồi check headerAccess-Control-Allow-*trong response — không pass là không cho gọi thật. - Django không có CORS built-in, dùng
django-cors-headers.
bash
pip install django-cors-headerspython
# settings.py
INSTALLED_APPS = [..., 'corsheaders']
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # PHẢI đặt TRƯỚC CommonMiddleware
'django.middleware.common.CommonMiddleware',
# ...
]
# Whitelist exact origin — đừng wildcard với credential
CORS_ALLOWED_ORIGINS = [
'https://app.example.com',
'http://localhost:3000',
]
CORS_ALLOW_CREDENTIALS = True # gửi cookie/Auth headerKhông bao giờ set CORS_ALLOW_ALL_ORIGINS = True cùng với CORS_ALLOW_CREDENTIALS = True — browser sẽ tự reject combo này theo spec, và về mặt logic là bạn đang mở cửa cho mọi website đọc dữ liệu user đã login.
- Cũng đừng nhầm CORS với CSRF: CORS quản ai được phép gọi, CSRF quản request đó có hợp lệ với user hiện tại không.
- Cả 2 đều cần thiết với cookie-based auth.