Json 用于基于令牌的身份验证的JWT与Cookie

Json 用于基于令牌的身份验证的JWT与Cookie,json,authentication,cookies,jwt,Json,Authentication,Cookies,Jwt,我读了一些关于“JWT vs Cookie”的帖子,但它们只会让我更加困惑 我想澄清一下,当人们谈论“基于令牌的身份验证与cookies”时,cookies这里仅仅指的是会话cookies?我的理解是,cookie就像一种媒介,它可以用来实现基于令牌的身份验证(存储一些可以在客户端上识别登录用户的东西)或基于会话的身份验证(在客户端存储一个与服务器端上的会话信息相匹配的常数) 为什么我们需要JSON web令牌?我使用标准cookie来实现基于令牌的身份验证(不使用会话id,不使用服务器内存或文

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

  • 我想澄清一下,当人们谈论“基于令牌的身份验证与cookies”时,cookies这里仅仅指的是会话cookies?我的理解是,cookie就像一种媒介,它可以用来实现基于令牌的身份验证(存储一些可以在客户端上识别登录用户的东西)或基于会话的身份验证(在客户端存储一个与服务器端上的会话信息相匹配的常数)

  • 为什么我们需要JSON web令牌?我使用标准cookie来实现基于令牌的身份验证(不使用会话id,不使用服务器内存或文件存储):
    设置cookie:user=innomy;首选颜色=azure
    ,我观察到的唯一区别是JWT同时包含有效负载和签名…而您可以选择http头的签名或明文cookie。在我看来,签名cookie(
    cookie:'time=s%3a14647434488946.WvSJxbCspOG3aiGi4zCMMR9yBdvS%2B6Ob2f3OG6%2FYCJM'
    )更节省空间,唯一的缺点是客户端无法读取令牌,只有服务器可以读取……但我认为这很好,因为就像JWT中的声明是可选的一样,令牌没有必要有意义


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

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

    浏览器自动发送cookies还有一个很大的缺点,那就是攻击。在CSRF攻击中,恶意网站利用浏览器会自动将身份验证cookie附加到该域的请求,并欺骗浏览器执行请求这一事实

    假设位于的网站允许经过身份验证的用户通过
    POST
    -ing将新密码更改为,而无需发布用户名或旧密码


    如果您在访问恶意网站时仍登录到该网站,而该网站在浏览器中加载了一个页面,从而触发对该地址的发布,则浏览器将忠实地附加身份验证cookies,从而允许攻击者更改您的密码

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


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

    除了MvdD所说的自动发送Cookie之外:

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

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

    Cookie和承载令牌都发送数据

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

    这些数据通常被编码为JWT

    cookie是一种名称-值对,存储在web浏览器中,并且具有到期日期和关联域

    我们使用JavaScript或HTTP响应头将cookie存储在web浏览器中

    document.cookie = 'my_cookie_name=my_cookie_value'   // JavaScript
    Set-Cookie: my_cookie_name=my_cookie_value           // HTTP Response Header
    
    web浏览器会自动将每个请求的cookie发送到cookie的域

    GET http://www.bigfont.ca
    Cookie: my_cookie_name=my_cookie_value               // HTTP Request Header
    
    承载令牌是进入任何HTTP请求的
    授权
    头的值。它不会自动存储在任何地方,没有到期日期,也没有关联的域。这只是一个价值。我们手动将该值存储在客户机中,并手动将该值添加到HTTP授权头中

    GET http://www.bigfont.ca
    Authorization: Bearer my_bearer_token_value          // HTTP Request Header
    
    和基于令牌的身份验证 当我们进行基于令牌的身份验证时,例如OpenID、OAuth或OpenID Connect,我们会从信任接收一个访问令牌(有时是id令牌)