Cross-Origin Sorğularında (CORS) Kukilərin Göndərilməməsi Probleminin Həlli Üçün Tam Bələdçi
Əgər serverin kukini düzgün təyin etdiyi (brauzer cavabında görünən), lakin sonrakı sorğularda brauzerin həmin kukini serverə geri qaytarmadığı ssenari ilə qarşılaşmısınızsa, bu bələdçi sizin üçündür. Bu problem demək olar ki, həmişə layihənizin ön tərəfi və arxa tərəfi iki fərqli domendə və ya portda olduqda baş verir — məsələn, ön tərəf app.example.com və API api.example.com üzərində.
Bu Niyə Baş Verir?
Müasir brauzerlər CSRF hücumlarının və sessiya oğurluğunun qarşısını almaq üçün iki ciddi təhlükəsizlik siyasəti tətbiq edir:
- CORS Siyasəti: Standart olaraq, brauzer server açıq şəkildə icazə vermədiyi təqdirdə, domənlərarası sorğularda kimlik məlumatlarının (kukilər kimi) göndərilməsinə icazə vermir.
- SameSite Siyasəti: Chrome 80-dən başlayaraq, kukilər standart olaraq
SameSite=Laxdavranışı ilə qəbul edilir, yəni onlarSameSite=Noneilə açıq şəkildə təyin edilmədiyi təqdirdə domənlərarası sorğularda göndərilməyəcək.
Vacib məqam budur ki, bu problemi həll etmək üçün həm klient, həm də server tərəfləri düzgün konfiqurasiya edilməlidir. Yalnız bir tərəfi düzəltmək kifayət deyil.
Addım 1: Serverin Düzgün Konfiqurasiyası
Server Tərəfində Üç Qızıl Qayda
Qayda 1 — Kimlik Məlumatlarını Aktivləşdirin: Server cavab başlığı aşağıdakı dəyəri ehtiva etməlidir:
Access-Control-Allow-Credentials: true
Qayda 2 — Wildcard İstifadə Etməyin: Kimlik məlumatları aktiv olduqda, Access-Control-Allow-Origin başlığında * simvolundan istifadə edə bilməzsiniz. Ön tərəfin tam domen ünvanını dəqiq göstərməlisiniz:
Access-Control-Allow-Origin: https://app.example.com
Qayda 3 — Kuki Atributları: Kuki iki atributla təyin edilməlidir: SameSite=None və Secure. Bu iki atribut olmadan, brauzer kukini saxlayacaq, lakin domənlərarası sorğularda onu heç vaxt göndərməyəcək.
Node.js (Express) Üçün Nümunə Kod
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors({
origin: 'https://app.example.com', // Ön tərəfin dəqiq domeni, sondaki / olmadan
credentials: true
}));
app.post('/login', (req, res) => {
res.cookie('session_token', 'abc123', {
httpOnly: true, // JavaScript-in kukiyə girişinin qarşısını alır
secure: true, // Yalnız HTTPS üzərindən göndərilir
sameSite: 'none', // Cross-Origin sorğularında göndərilməyə icazə verir
maxAge: 24 * 60 * 60 * 1000
});
res.json({ message: 'Giriş uğurlu oldu' });
});
PHP Üçün Nümunə Kod
<?php
// Ön tərəfin dəqiq domenini göstərin, * deyil
header("Access-Control-Allow-Origin: https://app.example.com");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
// Preflight sorğusuna cavab
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(204);
exit;
}
// Kukini tələb olunan atributlarla təyin etmək
setcookie('session_token', 'abc123', [
'expires' => time() + 86400,
'path' => '/',
'secure' => true, // Tələb olunur
'httponly' => true,
'samesite' => 'None' // Cross-Origin üçün tələb olunur
]);
Qeyd: Laravel istifadə edirsinizsə, config/cors.php faylında supports_credentials dəyərini true olaraq təyin edin və ön tərəf domenini allowed_origins massivinə əlavə edin.
Addım 2: Klient (Ön Tərəf) Konfiqurasiyası
Server konfiqurasiyası tam olsa belə, brauzer bu sorğunun "kimlik məlumatları ilə" olduğunu klient tərəfində açıq şəkildə bəyan etmədiyiniz təqdirdə kukiləri göndərməyəcək.
Fetch API İstifadəsi
fetch('https://api.example.com/user/profile', {
method: 'GET',
credentials: 'include' // Bu sətir problemin həllinin açarıdır
})
.then(res => res.json())
.then(data => console.log(data));
Axios İstifadəsi
// Müəyyən bir sorğu üçün
axios.get('https://api.example.com/user/profile', {
withCredentials: true
});
// Veya bütün layihə üçün qlobal olaraq
axios.defaults.withCredentials = true;
Sazlama Yoxlama Siyahısı
Yuxarıdakıları tətbiq etdikdən sonra problem hələ də davam edərsə, bu maddələri sıra ilə yoxlayın:
- ✅ Hər iki tərəf HTTPS-dədir?
Secureatributu o deməkdir ki, kuki yalnız şifrələnmiş bağlantılar üzərində işləyir. Saytınız HTTP-dədirsə, brauzer kukini qəbul etməyəcək. (İstisna:localhostüzərində inkişaf mühiti) - ✅ Origin ünvanı dəqiqdir?
Access-Control-Allow-Originünvanı brauzerdə gördüyünüz URL ilə eyni olmalıdır. Həttawwwfərqi və ya sondakaki/işarəsi uğursuzluğa səbəb olacaq. - ✅ OPTIONS sorğusu uğurludur? Brauzer tərtibatçı alətlərinin Network sekmesinde Preflight sorğusunu (OPTIONS metodu ilə) yoxlayın. Bu sorğu 200 və ya 204 kodu və düzgün CORS başlıqları ilə cavablandırılmalıdır.
- ✅ Kuki saxlanılıb? Brauzerdə DevTools ← Application ← Cookies yoluna gedin və kukinin
SecurevəSameSite=Noneatributları ilə saxlandığından əmin olun. - ✅ Aralıq proxy və ya firewall var? Bəzən Cloudflare və ya Nginx kimi veb serverlər başlıqları yenidən yazır. Onların konfiqurasiyasını da yoxlayın.
Xülasə
Domənlərarası sorğularda kukilərin göndərilməsi üç amilin əlaqələndirilməsini tələb edir: Access-Control-Allow-Credentials: true və dəqiq Origin ilə server, SameSite=None; Secure atributları ilə kuki və credentials: 'include' və ya withCredentials: true aktivləşdirilməsi ilə klient. Bu üç məqama riayət etməklə problem tamamilə həll olunacaq.
Etibarlı İnfrastruktur, Tərtibatçılar Üçün Rahatlıq
CORS-un düzgün tətbiqi və kuki idarəçiliyi hekayənin yalnız bir hissəsidir; layihənizin üzərində işlədiyi infrastruktur da xidmətin sabitliyində və təhlükəsizliyində həlledici rol oynayır:
Radib Hosting — Pulsuz SSL və standart başlıq konfiqurasiyası ilə tam dəstəkli yüksək sürətli veb hosting; layihələrinizin ön və arxa tərəfini hostinq etmək üçün ideal seçim.
Radib Virtual Server — Layihəniz tam giriş, xüsusi resurslar və veb server konfiqurasiyasında (Nginx/Apache) sərbəstlik tələb edirsə, güclü aparat və sabit şəbəkə ilə Radib virtual serverləri peşəkar API-lər üçün ən yaxşı seçimdir.
Radib Debugging və Təhlükəsizlik Xidmətləri — Mürəkkəb CORS səhvləri, autentifikasiya problemləri və ya təhlükəsizlik çətinlikləri ilə məşğul olursunuzsa, Radib-in texniki komandası veb tətbiqlərin sazlanması və təhlükəsizləşdirilməsində dərin təcrübəsi ilə problemi kökündən həll etmək üçün yanınızdadır.


