JWT与基于令牌的身份验证的cookie

时间:2016-06-02 04:02:23

标签: json authentication cookies jwt

我读了一些关于“JWT vs Cookie”的帖子,但它们只让我更加困惑......

  1. 我想要一些澄清,当人们谈论“基于令牌的身份验证与Cookie”, Cookie 时,这里只是指 会话饼干?我的理解是 cookie就像一个中等,它可以用来实现基于令牌的身份验证(存储可以在客户端识别登录用户的东西)或基于会话的身份验证(在客户端存储与服务器端的会话信息相匹配的常量

  2. 为什么我们需要 JSON网络令牌?我使用标准cookie来实现基于令牌的身份验证(不使用会话ID,不使用服务器内存或文件存储):import pandas as pd from openpyxl import load_workbook book = load_workbook('Abc.xlsx') writer = pd.ExcelWriter('Abc.xlsx', engine='openpyxl') writer.book = book writer.sheets = dict((ws.title, ws) for ws in book.worksheets) df.Manufacturer.value_counts().to_frame().to_excel(writer, sheet_name='Categories') writer.save() ,我观察到的唯一区别是JWT包含有效负载和签名 ...而您可以在http标头的 signed或plaintext Cookie之间进行选择。在我看来,签名cookie(Set-Cookie: user=innocent; preferred-color=azure)更节省空间,唯一的缺点是客户端无法读取令牌,只有服务器可以...但我认为它很好,因为就像声明在JWT中是可选的,令牌没有必要有意义

5 个答案:

答案 0 :(得分:80)

承载令牌和cookie之间的最大区别在于浏览器将 自动发送cookie ,其中需要将明确的加载令牌添加到HTTP请求中。

此功能使Cookie成为保护网站安全的好方法,用户使用链接登录并在页面之间导航。

浏览器自动发送cookie也有很大的缺点,即CSRF次攻击。在CSRF攻击中,恶意网站利用了这样一个事实:您的浏览器会自动将身份验证cookie附加到该域的请求,并诱使您的浏览器执行请求。

假设https://www.example.com处的网站允许经过身份验证的用户通过POST更改密码 - 将新密码更改为https://www.example.com/changepassword,而无需发布用户名或旧密码。

如果您在访问恶意网站时仍然登录该网站,该网站会在您的浏览器中加载触发POST到该地址的页面,您的浏览器将忠实地附加身份验证Cookie,允许攻击者更改您的密码。

Cookie也可用于保护Web服务,但现在最常使用的是承载令牌。如果您使用cookie来保护您的Web服务,则该服务需要存在于设置了身份验证cookie的域中,因为same-origin policy不会将cookie发送到其他域。

此外,Cookie使非基于浏览器的应用程序(如移动设备到平板电脑应用程序)更难以使用您的API。

答案 1 :(得分:47)

概述

您要求的是用于将JSON Web令牌(JWT)从客户端发送到服务器的cookie和承载令牌之间的区别。

Cookie和承载令牌都会发送数据。

一个区别是cookie用于发送和存储任意数据,而承载令牌专门用于发送授权数据。

该数据通常编码为JWT。

Cookie

Cookie是一个名称 - 值对,存储在Web浏览器中,并且具有到期日期和关联域。

我们使用JavaScript或HTTP Response标头将Cookie存储在Web浏览器中。

document.cookie = 'my_cookie_name=my_cookie_value'   // JavaScript
Set-Cookie: my_cookie_name=my_cookie_value           // HTTP Response Header

网络浏览器会自动向Cookie的每个请求发送Cookie。

GET http://www.bigfont.ca
Cookie: my_cookie_name=my_cookie_value               // HTTP Request Header

Bearer Token

承载令牌是一个进入任何HTTP请求的Authorization标头的值。它不会自动存储在任何地方,它没有到期日期,也没有关联的域。它只是一个价值。我们在客户端手动存储该值,并手动将该值添加到HTTP Authorization标头。

GET http://www.bigfont.ca
Authorization: Bearer my_bearer_token_value          // HTTP Request Header

JWT和基于令牌的身份验证

当我们执行基于令牌的身份验证(例如OpenID,OAuth或OpenID Connect)时,我们会从受信任的机构收到access_token(有时是id_token)。通常我们希望将其存储并与受保护资源的HTTP请求一起发送。我们怎么做?

选项1是将令牌存储在cookie中。它处理存储并自动将令牌发送到每个请求的Cookie标头中的服务器。然后,服务器解析cookie,检查令牌,并做出相应的响应。

另一种选择是将令牌存储在本地/会话存储中,然后手动设置每个请求的Authorization标头。在这种情况下,服务器读取标题并像cookie一样继续。

值得阅读链接的RFC以了解更多信息。

答案 2 :(得分:9)

除了MvdD所说的有关自动发送cookie的内容之外:

  1. Cookie可以是一种媒介,但其最重要的功能是它与浏览器的交互方式。 Cookie由服务器设置,并以非常具体的方式在请求中发送。另一方面,JWT完全是一种媒介,它是特定结构中某些事实的断言。如果您如此倾向,可以将JWT作为您的身份验证cookie。当您阅读比较它们的文章时,他们通常会讨论使用通过前端代码发送为承载令牌的JWT与对应于后端上的某些缓存会话或用户数据的身份验证cookie。
  2. JWT提供许多功能,并将它们置于标准中,以便它们可以在各方之间使用。 JWT可以作为许多不同地方的某些事实的签名断言。一个cookie,无论你放入什么数据或签名,只在浏览器和特定后端之间使用才真正有意义。 JWT可以用于从浏览器到后端,在不同方控制的后端之间(OpenId Connect就是一个例子),或者在一方的后端服务中。关于您签名的cookie的具体示例,您可以在该用例中实现与JWT相同的功能(“不使用会话ID,不使用服务器内存或文件存储”),但是您丢失了库和同行评审标准,除了在另一个答案中谈到的CSRF问题。
  3. 总结:您正在阅读的帖子可能是将JWT作为承载令牌与用于浏览器到服务器身份验证的身份验证Cookie进行比较。但是JWT可以做得更多,它带来了标准化和功能,可以在您可能正在考虑的用例之外使用。

答案 3 :(得分:6)

参考-Need for JSON Web Token

饼干

如果使用Cookie,则在对用户进行身份验证后,Gmail服务器将创建一个唯一的会话ID。对应于该会话ID,它将在Gmail中存储Gmail服务器用于识别用户并允许其执行操作所需的所有用户信息。
同样,对于所有后续请求和响应,此会话ID也将被传递。因此,现在服务器收到请求时,它将检查会话ID。使用此会话ID将检查是否有任何相应的信息。然后,它将允许用户访问资源并返回响应以及会话ID。

enter image description here

Cookie的缺点

  • Cookies /会话ID并非自包含。它是参考令牌。在每次验证期间,Gmail服务器都需要获取与其对应的信息。
  • 不适合涉及多个API和服务器的微服务架构

enter image description here

JWT

  • JWT是独立的。这是一个价值代币。因此,在每次验证期间,Gmail服务器都不需要获取与其对应的信息。
  • 它是经过数字签名的,因此如果有人对其进行了修改,服务器就会知道这一点
  • 最适合微服务架构
  • 它还有其他优点,例如指定到期时间。

enter image description here

答案 4 :(得分:0)

虽然cookie随请求一起自动发送 会增加CSRF攻击的风险,但是当设置HttpOnly标志时,它们可以降低XSS攻击的风险,因为注入页面的任何脚本都将无法读取Cookie。

CSRF:用户单击攻击者网站上的链接(或查看图像),这导致浏览器向受害者的网站发送请求。如果受害者使用cookie,则浏览器将自动在请求中包含cookie,并且如果GET请求可能导致任何非只读操作,则受害者站点很容易受到攻击。

XSS:攻击者将脚本嵌入受害者站点中(只有在未正确清理输入的情况下,受害者站点才容易受到攻击),并且攻击者的脚本可以执行允许页面上执行的javascript操作。如果将JWT令牌存储在本地存储中,则攻击者的脚本可以读取这些令牌,并将这些令牌发送到其控制的服务器。如果您使用带有HttpOnly标志的cookie,则攻击者的脚本将无法读取您的cookie。也就是说,他们成功注入的脚本仍将能够执行javascript可以执行的任何操作,因此您仍然受到IMO的控制(即,尽管他们可能无法读取Cookie并将其发送给自己的服务器以供以后使用) ,他们可以使用XHR将请求发送到vicitim站点,该站点仍将包含cookie。