如何以安全的方式为客户提供 JSON Web 令牌(JWT)?

Posted

技术标签:

【中文标题】如何以安全的方式为客户提供 JSON Web 令牌(JWT)?【英文标题】:How to give clients JSON web token (JWT) in secure fashion? 【发布时间】:2018-03-02 01:50:15 【问题描述】:

我有一个 python 应用程序需要为用户提供一个 JSON Web 令牌以进行身份​​验证。令牌是使用 PyJWT 库 (import jwt) 构建的。

从我所阅读的内容来看,在客户提供一些凭据(例如登录)后将令牌提供给客户似乎是一种可接受的做法。

然后,客户端在 Authorization Bearer 字段中的 HTTP 请求标头中使用该令牌,这必须通过 TLS 进行以确保令牌不被暴露。

我不明白的部分是如果客户端意外暴露了该令牌怎么办?这不会让任何拥有该令牌的人冒充他们吗?

将令牌传递给客户端的最安全方式是什么?

【问题讨论】:

你使用什么网络服务器?你必须在 ajax 请求中使用令牌吗? 使用自定义 web2py 服务器作为框架。令牌将在 ajax 中使用。 【参考方案1】:

您可以在将令牌交给客户端之前对其进行加密,或者使用他们自己的公钥,或者将密钥带外传递给他们。这样可以确保交付,但仍不能涵盖所有内容。

简而言之,没有简单的解决方案。您可以执行尽职调查并要求使用安全功能,但是一旦客户端解密了令牌,仍然无法确保他们不会意外或以其他方式暴露它。良好的安全性要求双方都养成良好的习惯。

令牌的好处是你可以给它们一个预设的生命周期,或者如果你怀疑它们已经被泄露,可以轻松地撤销它们并生成新的。

【讨论】:

【参考方案2】:

代币将根据用户提供的信息以及您后端决定成为代币一部分的内容来构建。为了获得更高的安全性,您可以将令牌信息扩展到用户的某些特定数据,例如当前 ip 地址或设备 mac 地址,这将为您提供更安全的身份验证方式,但会限制用户每次使用同一设备,作为重要的是,您可以在新登录发生时发送确认电子邮件。

【讨论】:

以上是关于如何以安全的方式为客户提供 JSON Web 令牌(JWT)?的主要内容,如果未能解决你的问题,请参考以下文章

将令牌从服务器传递到客户端并以安全方式存储

如何使用 javaScript 或 Angular 安全地存储 J.W.T 令牌?

如何从外部应用程序安全地使用json web令牌,与wordpress rest api对话

JSON Web 令牌中的客户端 ID 或多个受众

了解 Web 身份验证上下文中的 JSON Web 令牌 (JWT)

了解 Web 身份验证上下文中的 JSON Web 令牌 (JWT)