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