Angular 在JWT中使用booth cookie或拦截器有用吗?

Angular 在JWT中使用booth cookie或拦截器有用吗?,angular,authentication,cookies,jwt,jwt-auth,Angular,Authentication,Cookies,Jwt,Jwt Auth,我有一个只能通过身份验证访问的后端api。这是通过(JWT)提供的,只要提供了一对正确的凭证 现在我正在使用Angular 9为我的应用程序开发前端。登录由auth.service管理,如果提供了正确的凭据,该服务将返回JWT 在对服务器的第一个请求(登录请求)之后,我设置了一个用于在对api的后续请求中插入JWT值的参数。现在,我的一位同事说,我们必须将令牌值存储在浏览器的cookie中 对我来说,我找不到任何理由这样做:如果我们已经有了侦听器来验证请求,为什么还要在浏览器中存储凭据 所以有几

我有一个只能通过身份验证访问的后端api。这是通过(JWT)提供的,只要提供了一对正确的凭证

现在我正在使用Angular 9为我的应用程序开发前端。登录由
auth.service
管理,如果提供了正确的凭据,该服务将返回JWT

在对服务器的第一个请求(登录请求)之后,我设置了一个用于在对api的后续请求中插入JWT值的参数。现在,我的一位同事说,我们必须将令牌值存储在浏览器的cookie中


对我来说,我找不到任何理由这样做:如果我们已经有了侦听器来验证请求,为什么还要在浏览器中存储凭据

所以有几种方法可以回答这个问题:

这一切都归结为一点安全问题。因此,如果您将JWT令牌(应该始终不是长期存在的数据)存储在LocalStorage/SessionStorage或Cookie中

不同之处在于,可以从域中的每个javascript文件访问LocalStorage/SessionStorage,如果处理不当,可能会产生跨站点脚本(XSS)安全问题。为了防止自己受到XSS攻击,我建议您对所有不受信任的数据进行转义和编码

实际上,所有从前端到后端的通信。在水疗世界,这是一个标准,永远不要将来自前端的数据推送到后端进行检查

对于仅使用HttpOnly时的Cookie,不能通过JavaScript访问这些Cookie。还请确保设置安全标志,以便此cookie只能通过HTTPS发送(无需考虑)。当然,cookie也有其安全问题,因此您需要防止跨站点请求伪造(CSRF)。 如果您想了解更多信息,请阅读在JWT声明中添加XSRF-TOKEN的相关内容

简言之,我还建议使用cookies而不是LocalStorage/SessionStorage

一些有趣的内容如下:


所以有几种方法可以回答这个问题:

这一切都归结为一点安全问题。因此,如果您将JWT令牌(应该始终不是长期存在的数据)存储在LocalStorage/SessionStorage或Cookie中

不同之处在于,可以从域中的每个javascript文件访问LocalStorage/SessionStorage,如果处理不当,可能会产生跨站点脚本(XSS)安全问题。为了防止自己受到XSS攻击,我建议您对所有不受信任的数据进行转义和编码

实际上,所有从前端到后端的通信。在水疗世界,这是一个标准,永远不要将来自前端的数据推送到后端进行检查

对于仅使用HttpOnly时的Cookie,不能通过JavaScript访问这些Cookie。还请确保设置安全标志,以便此cookie只能通过HTTPS发送(无需考虑)。当然,cookie也有其安全问题,因此您需要防止跨站点请求伪造(CSRF)。 如果您想了解更多信息,请阅读在JWT声明中添加XSRF-TOKEN的相关内容

简言之,我还建议使用cookies而不是LocalStorage/SessionStorage

一些有趣的内容如下:


JWT令牌,用于允许Angular应用程序执行http请求,这些请求仅允许经过身份验证的用户执行

因此,在用户经过身份验证后,您将需要JWT

然后,拦截器有助于查看HTTP请求在执行之前是否具有JWT,以及是否未将其添加到HTTP请求中

现在的问题是:我将JWT存储在应用程序中的什么位置,以便在每次需要向后端服务器发出HTTP请求时都不会向用户请求身份验证

这里有两个选项:本地/会话存储(由于安全原因不推荐)和cookie

大多数Angular/Web课程或博客都展示了使用本地/会话存储的示例,但由于安全问题,不推荐使用。这是一个很好的解释:


因此,存储JWT的最佳位置是cookie。

JWT令牌,用于允许Angular应用程序执行仅允许用户验证的http请求

因此,在用户经过身份验证后,您将需要JWT

然后,拦截器有助于查看HTTP请求在执行之前是否具有JWT,以及是否未将其添加到HTTP请求中

现在的问题是:我将JWT存储在应用程序中的什么位置,以便在每次需要向后端服务器发出HTTP请求时都不会向用户请求身份验证

这里有两个选项:本地/会话存储(由于安全原因不推荐)和cookie

大多数Angular/Web课程或博客都展示了使用本地/会话存储的示例,但由于安全问题,不推荐使用。这是一个很好的解释:

因此,存储JWT的最佳位置是cookie。

编辑

我刚刚又读了一遍你的问题,你根本没有提到本地存储。所以,如果你的JWT只存储在内存中,当你刷新页面时,它就会丢失,就像MikeOne在评论中说的那样

结束编辑

如果您已经在使用localStorage,一个有效的原因是您计划使用angular universal进行服务器端渲染

如果渲染图像服务器端,则本地存储不存在,因此api调用将不包含JWT令牌

这意味着即使您已经登录,服务器响应也可能会将您重定向到登录页面,或者在客户端显示仅连接用户的内容之前,您可能会短暂地看到该页面的公共版本

关于证券