本机移动应用程序的 Cookies 和 JWT 之间的显着差异

Significant differences between Cookies and JWT for native mobile apps

我一直在我的 Web 应用程序中使用 Cookie 进行身份验证和会话控制,并且对它的功能感到满意。

一位 iOS 应用程序开发人员向我介绍说,新的热门事物是 JWT(JSON Web Token)。他告诉我 JWT 是 为原生移动应用程序进行身份验证和会话的方式 ,并且没有给出具体示例,他建议 iOS 和 Android 应用程序Cookie 有各种问题。

所以我查找了 JWT,例如http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/ and https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/, and I failed to see why it is significant better (or even that different) than Cookies, and more specifically, why it does better in native mobile apps. It seems that, at least iOS, handles Cookies just fine (Persisting Cookies In An iOS Application?).

所以我的问题是,对于与服务器端交互的本机移动应用程序 API,使用 JWT 而不是 Cookie 进行身份验证和会话的具体优势和相关用例是什么?请突出显示 Cookies 根本无法做到或做得更差的那些。

我们软件开发人员(有时)倾向于随处应用新的热门事物;这可能是谚语的变体如果我们只有一把锤子,一切看起来都像钉子,在这种情况下,我们只是感到一种绝望的冲动,想要使用我们学到的这个新东西。

关于此比较的一个有趣点是,JWT or Cookies are in fact authentication mechanisms on their own; the first just defines a token format and the second is an HTTP state management mechanism 都没有。仅此就足以让我们明白,鼓吹一个比一个好是错误的。

不过,这两者都广泛用于身份验证系统。

传统的服务器端 Web 应用程序使用 cookie 来跟踪经过身份验证的用户,这样他们就不会被迫在每次请求时提供其凭据。通常,cookie 的内容将是(希望如此)随机生成的唯一标识符,服务器将使用该标识符来查找存储在服务器上的会话数据。

但是,对于一种新型的 Web 应用程序 - API - 更常见的是接受令牌(大部分时间采用 JWT 格式)作为服务器决定是否接受令牌的一种方式应该向提出请求的人授予访问权限。其原因可能是因为传统的 Web 应用程序有一种主要类型的客户端,即 Web 浏览器,它完全支持 cookie,API 通常由更简单的 HTTP 客户端使用,这些客户端不支持原生支持 cookies。

我认为这也是为什么我们可能会争辩说基于令牌的身份验证对本机移动应用程序更有意义。这些应用程序通常依赖于服务器端 Web API 并且我们已经看到,如果 API 支持令牌,它将增加可以使用它的客户端范围,因此它是最实用的东西做。

总而言之,为了回答您的具体问题,我想说 JWT 在本机移动应用程序上确实比 cookie 有优势,因为它们目前使用非常普遍,这意味着更多的学习资源,SDK ,已知的陷阱(主要是因为其他人已经做过但失败了),等等

尽管如此,只有在它们为您提供所需的安全保证并最终简化您的场景时才使用它们。如果您还没有经历过,我想您也会喜欢 Cookies vs Tokens: The Definitive Guide

我不能代表 Android,但在 iOS 上,cookie 与 URLSession 的工作效果与 headers 一样好。一旦您可以利用(标准)API 权利(例如专用的、正确配置的 session 每个网络应用程序的 cookie 存储...),iOS 应该是这个决定的一个相当微不足道的因素.