簡體   English   中英

Laravel Sanctum 和基於 Cookie 的會話安全性

[英]Laravel Sanctum and Cookie-Based Session Security

所以我設置了一個 SPA,使用 Laravel Sanctum 建議的基於 cookie 的身份驗證對 Laravel 應用程序進行身份驗證。

但是,我很難理解使用基於 cookie 的會話的安全性。 據我所見,如果我使用 Laravel 應用程序進行身份驗證,我會在存儲客戶端的 cookie 中收到會話。 一切都很好,並且在意料之中。

但是,如果我隨后請求一些數據,然后繼續注銷我的應用程序,然后在網絡選項卡中發送一個包含先前請求的數據請求,我會返回數據,盡管之前曾嘗試使用 Laravel 進行未經身份驗證。 在我看來,Laravel 並沒有使之前的會話無效。

采取以下場景:

  • 發送 GET 到 /sanctum/csrf-cookie
  • 使用上述 cookie(和身份驗證憑據)將 POST 發送到 /auth/login
  • 使用上述 cookie 向 /auth/user 發送 GET(接收 auth 用戶返回)
  • 使用上面的 cookie 發送 POST 到 /auth/logout
  • 會話應該無效
  • 發送 POST 到 /auth/user(使用第一個 cookie,或在網絡選項卡中重新發送第一個 /auth/user 請求)
  • 嘗試注銷后,我取回了 /auth/user 數據

我無法理解 Laravel 會允許這成為一件事,所以我有點相信我在某個地方遺漏了一步。

以下是我目前在注銷控制器中的內容; 我嘗試過使用和不使用網絡保護,使用和不使用會話無效調用。 是否有這樣做的“正確”方式,或者這只是基於 cookie 的會話工作方式中的一些缺陷; 它們僅存儲在客戶端嗎? 我應該能夠再次請求數據並通過身份驗證嗎?

Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();

我在使用cookie會話驅動程序和Auth::guard('web')->logout();時遇到了同樣的問題在我的注銷網絡路由中。 雖然我找不到任何文檔來支持這一點,但我相信這是因為 cookie 僅存儲在此配置中的客戶端。

將驅動程序從cookie更改為database通過保留會話數據服務器端解決了該問題,注銷功能能夠使其無效,並且先前發出的 cookie 將不再起作用。

要進行此更改,我們可以按照Laravel 文檔中的說明進行操作:

使用database會話驅動程序時,您需要創建一個表來包含會話記錄。 [...] 您可以使用session:table Artisan 命令來生成此遷移。

php artisan session:table
 
php artisan migrate

完成此操作后,將.env文件中的SESSION_DRIVER選項從cookie更新到database

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM