Session JWT和签名cookie之间有什么区别?

Session JWT和签名cookie之间有什么区别?,session,authentication,cookies,express,jwt,Session,Authentication,Cookies,Express,Jwt,我正在研究使用cookie作为传统会话的替代方案,但我看不出它们与签名cookie有什么本质区别,例如Express通过中间件提供的签名cookie 在这两种方法中,最后一部分是有效负载的签名,它保证有效负载没有被篡改 签名cookie: user=tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3 等效JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiVG9iaSJ9.kCTlR_Ig

我正在研究使用cookie作为传统会话的替代方案,但我看不出它们与签名cookie有什么本质区别,例如Express通过中间件提供的签名cookie

在这两种方法中,最后一部分是有效负载的签名,它保证有效负载没有被篡改

签名cookie:

user=tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3 
等效JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiVG9iaSJ9.kCTlR_Igb4H5cqBEDedShM2ivSQijPQkWqN4pZAXb2g
除了以下事实:

(1) JWT没有原产地限制

(2) cookie内容是直接可读的,而JWT内容(头+负载)是base64编码的


JWT是否有明显优于签名cookies的优势?

cookies通常用于保护web应用程序。浏览器会自动将它们添加到每个请求中。这使得请求容易受到攻击

JWT令牌通常用于保护Web API。标记以JavaScript形式附加到AJAX请求。由于令牌不会自动附加到请求,因此请求不易受到CSRF攻击。JWT令牌也可以跨源使用,以防您正在谈论的API位于另一个域上


JWT令牌也用于本机客户端与web API对话。

注意不要混淆问题:Cookie主要是用于在客户端上存储数据的机制,它们本质上不是一种身份验证机制,但我们是这样使用的:)

JWTs的主要优点是声明的结构(JSON,带有公共字段)和声明的签名机制。这只是规格说明,没有什么特别之处。但是有一种坚持身份断言的通用方法是很好的

您仍然需要以安全的方式存储JWT,以及仅使用
HttpOnly的cookies;安全
是最佳选择。这可以防止JavaScript环境读取cookie,从而防止XSS攻击

我写了一些关于JWTs的博客文章,其中包含了更多信息,有助于回答您的问题:

免责声明:我确实在工作。我们赞助Node.js和Java的开源JWT库,可以在这里找到:


如果您使用的是AngularJS,那么我们也可以通过我们的

实现JWT最佳实践。我发现这篇文章非常有用:。它首先讨论了两者之间的相似性,然后讨论了它们之间的差异,这有助于使问题变得非常清楚


对我来说,这归结为理解cookies是服务器用来检查数据库中的活动会话的。JWT可以存储在cookie中,但通常使用授权头发送。服务器使用算法验证JWT,而不是检查数据库中是否有活动会话。

底层文章对很多人都有误导,尤其是结论部分。Cookie只是通过特定的头附加到请求上的一块信息,并没有严格的策略—它的内容应该是什么以及应该存储在哪里。也就是说,您可以像JWT一样对相同的信息进行签名和加密,并消除存储会话cookie的任何DB使用,您可以启用CORS并使用cookie e.t.c跨域发送前端请求。