Webapp 使用 rest 进行身份验证 API

Webapp authenticate with rest API

这是一个很笼统的问题。想象一个现代 "single-page" javascript Web 应用程序,它依赖于 AJAX 调用 rest API 来进行数据访问。

其余 API 只能通过提供唯一的令牌访问,该令牌已注册给用户。可以通过在某个端点提供用户名和密码来检索(或创建)令牌,例如/login.

现在,一旦用户检索到令牌,我该如何存储它?我知道几种可能的方法,但我不知道怎么做才安全。

将其存储在 cookie 中:不!因为 cookie 暴露给文件系统并且很容易被破坏。

保存在浏览器的localstorage中:嗯,可能不会。您访问的任何页面都可以访问本地存储,因此具有抓取功能的恶意站点可能会获取它。

将其存储在 javascript 的内存中,直到用户离开页面:我认为这应该是相对安全的。但是,如果我想记住两次访问之间的登录怎么办?然后我必须在服务器上保持会话吗?如果我需要这个会话,那么使用令牌有什么意义呢?还不如在每次请求时重新发送用户名和密码,对吗?

我还没有想到其他解决方案吗?人们如何做到这一点?

你在几个方面是错误的:

Store it in a cookie: Nope! Cause cookies are exposed to the file system and can easily be compromised.

使用 cookie 通常是一个可以接受的存储秘密的地方。很多人都这样做。我想说的是,风险不在于它存储在文件系统上(如果黑客可以访问文件系统,任何类型的保护都将消失),但更多的是它在每个请求中都被提交,这为CSRF。如果你不需要它,你可以避免它,很好!

Store it in localstorage in the browser: Well, probably not. Local storage is accessible by any page you go to, so a malicious site with a scraping feature might pick it up.

它实际上无法通过任何页面访问,只能通过您的沙箱(通常是您的域)访问,因此它具有 cookie 的优点,没有缺点。

我找到了 this article,它很好地说明了需要注意的事项。

简而言之:Localstorage 很难防止 XSS 或代码中的安全错误,因为它可以通过 javascript 访问。用于存储会话密钥的 cookie 不是 restful,因为状态存储在服务器上,但是,它们可用于存储访问令牌,如 JWT,如果 cookie 是 HttpOnly;Secure;