在跨域场景下,为什么基于令牌的身份验证比基于 cookie 的身份验证更好?

3

我在很多地方看到过,相比于基于cookie的身份验证,基于令牌的身份验证的好处之一是更适合CORS/跨域场景。

但是为什么呢?

以下是CORS场景

http://domain-a.com提供的HTML页面发出对http://domain-b.com/image.jpg<img> src请求。

即使我的机器上有一个令牌,<img>标签怎么知道在哪里找到它并发送它呢?

根据这里的建议,建议将JWT存储为cookie,那么它如何在CORS /跨域场景中生存? ADD 1 基于令牌的身份验证比基于会话cookie的身份验证更易于扩展。请参见相关线程:无状态Web应用程序,一个城市传说?
1个回答

2
仅作澄清:对于任何您拥有的子域的请求也被视为跨源请求(例如,您从www.example.com向api.example.com发出请求)。
一个简单的<img> GET请求到另一个来源,确实也是跨源请求,但是如果您仅使用GET、HEAD、POST请求,并且您的Content-Type标头是以下之一,则浏览器不会使用预检(OPTION)请求:
- application/x-www-form-urlencoded - multipart/form-data - text/plain
因此,对于另一个来源的简单<img>请求将没有问题(无论是子域还是完全不同的域),因为它不会经过预检,除非它需要凭据,因为当您添加Authorization标头时,请求需要经过预检。
关于在localstorage和cookie中存储的问题:Localstorage具有单个来源策略,这意味着您无法从子域访问已存储的数据,即example.com无法访问api.example.com中的localstorage中的数据。另一方面,使用cookies,您可以定义哪些子域可以访问cookie。因此,您可以访问存储在cookie中的令牌并将其与请求一起发送到服务器。Cookies还不允许跨不同域访问数据。
希望这能帮到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接