ajax請求攜帶 cookie

以前都有這樣一個理解:
ajax請求時是不會自動帶上cookie的,要是想讓他帶上的話,必須喲啊設置withCredential爲true。
這個說法會讓人產生徹底扭曲的誤解,我就是其中之一。
完整的無歧義的表述應該是這樣:
1.ajax會自動帶上同源的cookie,不會帶上不一樣源的cookie
2. 能夠經過前端設置withCredentials爲true, 後端設置Header的方式讓ajax自動帶上不一樣源的cookie,可是這個屬性對同源請求沒有任何影響。會被自動忽略。
3. 這是MDN對withCredentials的解釋: MDN-withCredentials ,我接着解釋一下同源。
衆所周知,ajax請求是有同源策略的,雖然能夠應用CORS等手段來實現跨域,可是這並非說這樣就是「同源」了。ajax在請求時就會由於這個同源的問題而決定是否帶上cookie,這樣解釋應該沒有問題了吧,還不知道同源策略的,應該去谷歌一下看看。php

實驗
第一步: 創建一個本地服務器html

1.新建一個demo文件夾,進入文件夾,用php -S localhost:9000開啓一個本地服務器
2.在demo文件夾下新建一個index.php文件, 內容爲:前端

  1.  
    <?php
  2.  
    header( "Access-Control-Allow-Origin: http://localhost:9999");
  3.  
    header( 'Access-Control-Allow-Credentials:true');
  4.  
    $value = "something with cookie";
  5.  
    setcookie( "testcookie", $value, time() + 3600);
  6.  
    echo "cookie has seted";

注意: Access-Control-Allow-Origin必須制定特定的URL,不能是*, 且須要加上Access-Control-Allow-Credentialsjquery

第二步: 編寫請求測試代碼web

在桌面上新建一個test.html文件,內容爲:ajax

  1.  
    <!DOCTYPE html>
  2.  
    <html lang="en">
  3.  
    <head>
  4.  
    <meta charset="UTF-8">
  5.  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.  
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7.  
    <title>Document</title>
  8.  
    <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
  9.  
    </head>
  10.  
    <body>
  11.  
    <script>
  12.  
    $.ajax({
  13.  
    url: "http://localhost:9000/",
  14.  
    type: 'GET',
  15.  
    success: function(data) {
  16.  
    console.log(data)
  17.  
    },
  18.  
    error: function(err) {
  19.  
    console.error(err)
  20.  
    }
  21.  
    })
  22.  
    </script>
  23.  
    </body>
  24.  
    </html>
  1. 在desktop目錄下起一個服務器,用php -S localhost:9999開啓一個本地服務器
    第三步: 測試
    1.在瀏覽器中訪問localhost:9999/test.html,打開調試工具->application->cookie能夠看到cookie設置成功。
    2.打開調試工具->netwoek,刷新一下,能夠看到一個localhost請求,檢查這個localhost請求的Request Headers,發現沒有cookie這個頭部,說明不一樣源的請求時不會帶上cookie的(即便有CORS)
    3.把test.html放到demo文件夾下,在訪問localhost:9000/test.html,查看Request Headers,會發現cookie頭部, 說明同源請求自動帶上了cookie
    4.把test.html的內容更改成如下內容,請求時會有cookie頭部。說明withCredentials起做用了
  1.  
    <!DOCTYPE html>
  2.  
    <html lang="en">
  3.  
    <head>
  4.  
    <meta charset="UTF-8">
  5.  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.  
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7.  
    <title>Document</title>
  8.  
    <script src="jquery-2.2.4.min.js"></script>
  9.  
    </head>
  10.  
    <body>
  11.  
    <script>
  12.  
    $.ajax({
  13.  
    url: "http://localhost:9000",
  14.  
    type: 'GET',
  15.  
    xhrFields: {
  16.  
    withCredentials: true // 這裏設置了withCredentials
  17.  
    },
  18.  
    success: function(data) {
  19.  
    console.log(data)
  20.  
    },
  21.  
    error: function(err) {
  22.  
    console.error(err)
  23.  
    }
  24.  
    })
  25.  
    </script>
  26.  
    </body>
  27.  
    </html>

參考:https://zhuanlan.zhihu.com/p/28818954
https://www.zhihu.com/question/25427931
同源策略
http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html
https://stackoverflow.com/questions/2870371/why-is-jquerys-ajax-method-not-sending-my-session-cookie
服務器也能夠在設置Cookie的時候,指定Cookie的所屬域名爲一級域名,好比.example.com。後端

Set-Cookie: key=value; domain=.example.com; path=/
這樣的話,二級域名和三級域名不用作任何設置,均可以讀取這個Cookie。跨域

同源策略是瀏覽器最核心也最基本的安全功能首先:web是開放的世界, 須要互聯連接. 你的網站, 可使用別人的圖片, img, 使用別人 script 作統計, 作廣告聯盟瀏覽器

假設沒有同源, 互聯網世界是什麼樣?連接跳轉致使的問題. http://a.com , 放一個連接到 icbc.com, 而後 window.open來打開, 獲取窗口句柄, 而後能夠擁有對這個頁面徹底的控制權. 攔截表單,捕獲數據,將帳號密碼上傳到a.com.ajax請求, 要啥就有啥. 你登陸jd.com; 而後打開a.com, 經過ajax 請求http://jd.com 的用戶信息接口, 這時候由於訪問的jd.com,因此瀏覽器自動帶上了jd的cookie,而後獲取到你的訂單list ,暱稱, 全部私密信息.因此,須要要同源策略安全

在同一個域內,客戶端腳本能夠任意讀寫同源內的資源,dom,cookie;可是不一樣的域,就不行.

相關文章
相關標籤/搜索