如何在身份验证中使用JWT?

时间:2018-10-30 12:56:09

标签: security session cookies jwt

我最近决定回顾当今的身份验证流程和可用的解决方案。简单来说,我感兴趣的选项有2个:会话/ Cookie JWT

让我们检查一下第一个。 Sessions是“古老而又黄金的”技术,至今仍在大多数基于服务器的应用程序中广泛使用。

会话/ cookie的优势

  • 易于使用
  • 已加密
  • 防止XSS攻击(带有httpOnly标志)
  • 防止CSRF攻击(带有sameSite标志)
  • 易于设置到期时间
  • 通过设置适当的标头轻松从服务器端进行管理
  • 可以使用会话存储(例如redis)进行扩展

缺点

  • 小巧(4kb)
  • 用于基于服务器的应用程序,不适用于SPA(单页应用程序)
  • 跨域请求问题
  • 由于许多应用程序可以使用单个API,因此很难通过会话管理身份验证
  • SSO(单点登录)-如何实施?
  • 需要其他服务器来存储会话数据
  • 需要为每个请求查询数据库(以检查用户ID)

因此,在现代世界中,JWT来解决这些问题。

智威汤逊的优势

  • 从本质上保证
  • 无状态,适用于任何平台(网络,移动)
  • 最适合Restful APIs
  • 广泛用于SSO(单一登录)
  • 由于令牌可以包含不可变的数据,因此无需在服务器端查询数据库(以检查用户ID)
  • 很好,可以安全地在各方之间传输数据,因为不可能伪造数据

缺点

  • 尺寸更大
  • 在服务器端不容易管理
  • 需要从客户端手动发送带有标头的邮件

在大量阅读了该主题之后,我仍然不知道如何正确处理JWT。让我们来谈谈客户端以及如何存储JWT。

我猜大多数人都发现将JWT存储在localStorage中很容易,但这当然不是一个好主意,因为它不安全且容易受到XSS攻击。饼干? -我认为,可能只是cookie而没有设置会话,但必须处理跨域请求并且不易受CSRF攻击。您知道实现此目标的正确方法吗?我还有一个大问题-在哪里存储?

另一方面,假设我们有SPA,那么现在很流行。从Auth0 documentation

  

单页应用程序

     

如果您有一个没有相应后端服务器的单页面应用程序(SPA),则您的SPA应该在页面加载时请求新令牌并将其存储在内存中而没有任何持久性。要进行API调用,您的SPA然后将使用令牌的内存中副本。

这是否意味着我必须登录并在每次刷新页面时获取令牌? -来吧,这不是办法。我希望用户保持登录状态。

那么回到带有会话/ Cookie的服务器端常规Web应用程序呢?我个人更喜欢JWT,那么使用JWT的最佳方式/流程是什么?我将不胜感激任何清楚的解释。谢谢!

1 个答案:

答案 0 :(得分:0)

JWT本质上并不安全。这不是一个好的或安全的标准。 http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/

关于如何使用户保持在SPA上的登录,您可以使用会话。将会话密钥存储在cookie中,然后在页面加载时将REST API调用发送到后端以加载用户/会话数据。

或者,使用身份验证流程,在该流程中,当用户加载应用程序时将用户重定向到ID服务器。然后,ID服务器可以设置cookie,并管理身份验证,而无需用户再次登录。这与您询问的SPA解决方案相似,但是用户不会注意到它。

相关问题