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:

  1. 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.
  2. SameSite Siyasəti: Chrome 80-dən başlayaraq, kukilər standart olaraq SameSite=Lax davranışı ilə qəbul edilir, yəni onlar SameSite=None ilə 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=NoneSecure. 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? Secure atributu 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ətta www fə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 SecureSameSite=None atributları 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.

 

Bu cavab sizə kömək etdi? 112 istifadəçi bunu faydalı hesab edir (112 səs)