php - 有没有办法在 Ajax 请求之后将 cookie 从 laravel 设置到另一个域?
问题描述
我正在学习 Laravel 护照包并使用 Vue.js 创建一个 SPA 来测试它,我想知道将令牌保存在客户端浏览器中,如果我将它保存在本地存储中,它将可以从 Javascript 访问并且任何人运行 js在浏览器上就可以阅读了!我的问题是;这种情况的解决方案是什么?如果我将令牌保存在 cookie 中它也可以访问,并且我阅读了有关 httpOnly cookie 的信息,那么如果 Javascript 无法访问令牌,我该如何设置 cookie 以从 API 的响应中保存令牌?有没有办法从 API 中保存 cookie?
我希望我能找到我的问题的答案。
解决方案
好吧,这里有几件事要理解。
仅 HTTP cookie
首先,HTTP cookie 由服务器使用set-cookie标头设置。在这种情况下,您作为开发人员无需做任何事情。浏览器会自动为您设置它,并将在每个 Ajax 或非 ajax 请求上发送回服务器。只要它没有过期,它就会发送cookie。
本地存储
当使用 LocalStorage 存储令牌时,任何 JavaScript 代码都可以读取它(如果被滥用,称为 XSS 攻击)。但是,这里要理解的关键是其他域的 JavaScript 代码无法读取 LocalStorage。范围仅限于您自己的站点。其他网站的 JS 无法读取。因此,如果您没有使用任何外部依赖项或受损的 CDN,那么您是安全的。
跨站 cookie
不可以。在任何情况下都无法设置跨域 cookie。只有其他域的服务器可以为自己设置一个 cookie(除非你有一些后端机制,比如 Gmail + Youtube 来共享会话)。但是,如果是子域,则允许以下内容:
- 父域可以为任何子域设置 cookie。那就是
example.com
可以为*.example.com
. - 子域可以为父域设置cookie。那就是
xyz.example.com
可以为example.com
.
当然,规则比这更复杂。这篇文章应该可以帮助你进一步理解。
推荐阅读
- javascript - .toLocaleString() 未定义
- php - 读取多个 php 文件并用动态 PHP 代码替换 HTML div
- php - 在 Windows 上启用跳过网络时,通过命名管道将 PHP/phpMyAdmin 连接到 MySQL/MariaDB
- c# - 使用 https 协议的生产中的 HTTP2_Protocol 错误
- azure-devops - 天蓝色管道:访问秘密变量
- java - Hibernate Search/Lucene range query with enum field doesn't return any results
- flutter - 在 Flutter 中分享图像和视频
- r - 在创建列表 tibble 列时在“mutation”中使用 dplyr::sym() 会导致错误 is_symbol(x): object '.x' not found
- azure - 使用 TopicClient/QueueClient.sendAsync(IList) 发送的消息列表的大小限制
) 在 Microsoft Azure 服务总线 - 2020 - google-apps-script - 如何在 G Suite Marketplace 中获取应用使用情况报告?