【问题标题】:How to handle the JWT on the client layer?如何处理客户端层的 JWT?
【发布时间】:2019-03-04 09:52:03
【问题描述】:
这是一个主观问题,尽管我认为这不是基于意见的。在这里问它的唯一原因是,即使阅读了多篇关于 JWT Authentication 的文章,我也找不到满意的答案。
我最近开始学习 JWT,发现它是由服务器向客户端发出的一个由 3 部分组成的令牌,用于验证真实性,并以声明的形式传递用户范围/角色/权限等数据。
我的问题是:
token 的声明部分仍然是 base64 编码的字符串,可以使用 atob/btoa 轻松解析。那么传输真的安全吗?这里真正的收获是什么?
有多篇关于生成令牌并将令牌发送到 UI 的文章。但是,几乎没有关于 UI 究竟如何使用它的好文章。使用atob 解码令牌并使用其中的内容是一种常见的做法吗?或者是否有不同的方式来验证和检索数据。
通过标头传输数据真的安全吗?我的意思是它对 MITM、XSS 等安全吗?
我非常感谢专家为解决这些问题所做的一些努力?
【问题讨论】:
标签:
javascript
security
client
jwt
【解决方案1】:
对于问题 #1,客户端的增益不是。如果您不能信任从服务器收到的内容,那么无论它如何混淆/编码/加密/,您都无法信任它。关键是您将这个令牌 back 发送到服务器。在服务器上,快速检查会告诉你这个令牌是合法的。想象一个复杂的登录场景,MegaCorp 在 739 个子系统中查找用户的权限,将它们组合成一个有效负载,然后在进一步的请求中不必再次这样做。当客户端发回令牌时,它会验证您是否已正确登录并使用权限进行进一步处理。
对于 #2,您可以将任何您喜欢的内容放入此有效负载中,只要它不是太安全即可。我主要将它用于基本用户信息和应用程序权限。因此,我可以绘制用户名并提供指向特定用户设置页面的链接。我可以检查用户是否有权访问管理页面或我需要检查的任何权限。虽然恶意用户可以通过在客户端操纵该数据来欺骗系统,因此可以查看管理页面,但当调用返回服务器以获取该页面的数据时,令牌要么是非法的,要么请求将被拒绝,或者它不包含适当的权限,并且再次被拒绝。
我对安全性的了解还不够,无法尝试回答 #3。
有些人只为isLoggedIn 使用 JWT,这很好,但我认为错过了一些有用的可能性。如果使用得当,这可能是为客户端和服务器捕获用户信息的单一机制。但我认为重要的一面是服务器。这可以在客户端以多种方式完成。但是很难找到更适合服务器的东西。
【解决方案2】:
token 的声明部分仍然是 base64 编码的字符串,可以
使用 atob/btoa 很容易解析。那么传输真的安全吗
?这里真正的收获是什么?
如果您通过 https 发送令牌,则传输是安全的(其他人无法读取/修改)。 JWT 包含 2 个重要部分:有效负载和验证签名。
签名只能由一个人生成和验证,并证明有效载荷对该人是合法的。
这是一个简单的用例:
- 客户端发送是 Auth 服务器的凭据,用于接收发布内容的权利
- 服务器接收凭证并通过一个复杂的过程对其进行验证,然后向客户端发送回一个 JWT 语句:{I give Client the right to publish signed the Auths erver}
- 客户端在本地存储令牌
- 当客户端需要发布某些内容时,他会发送 JWT 并在与 Auth 服务器共享签名密钥的服务器 B 上工作。
- 服务器 B 轻松验证令牌并发布客户端的工作
另一个使用示例是仅通过邮件进行身份验证。
关于生成令牌并将其发送到 UI 有多篇文章。
但是,几乎没有关于 UI 究竟如何使用它的好文章。是
使用 atob 解码令牌并使用
里面的内容呢?或者是否有不同的验证方式和
从中检索数据。
一般来说,客户端希望从某个服务器获取令牌以便稍后将其发送回来。客户端无法验证签名,因为他不与服务器共享私钥,他不是信任来源。
通过标头传输数据真的安全吗?我的意思是它安全吗
针对 MITM、XSS 等。
使用 https 是安全的:Are HTTPS headers encrypted?