REST 安全性,使用基本身份验证和 jwt 令牌验证是一种不好的做法吗?

Posted

技术标签:

【中文标题】REST 安全性,使用基本身份验证和 jwt 令牌验证是一种不好的做法吗?【英文标题】:REST security, is a bad practice to use basic auth plus jwt token verification? 【发布时间】:2020-10-21 03:40:34 【问题描述】:

我正在制作一个安全的休息服务,并且我已经使用基本身份验证加上之前获得的 jwt 令牌对其进行了保护,我是否让安全性太强或者这是一个必须遵循的路径?

【问题讨论】:

你是什么意思你同时使用?基本身份验证使用 Authorization: Basic <payload> 标头对您发出的每个请求进行身份验证。完成此操作后,您再次进行身份验证并生成 JWT 令牌?还是基于基本身份验证生成的令牌?你把它放在哪里?进入Authorization: Bearer <payload>。你有两个标题吗? 【参考方案1】:

同时使用 HTTP Basic auth 和 JWT 令牌不会使应用程序更安全,它实际上会降低安全性,并且处理起来更复杂。

HTTP 基本身份验证由用户代理(通常是浏览器)完成。它将Authorization: Basic <payload> 标头永久添加到每个请求中。您无法注销。除非您关闭代理,否则它将在那里。唯一的好处是可以使此身份验证无效。而且我们通常不会将这种身份验证用于人类,但仅用于微服务,因为浏览器中的处理很差(忘记关闭选项卡并注销,如果有人可以物理访问您的计算机,您就完成了)。

JWT 好一点。它可以过期。但不能失效(至少不设置额外的基础设施)。

现在你得到的是两个世界中最糟糕的。您无法注销。如果您的 JWT 令牌过期,它将重新生成,因为您仍然拥有基本身份验证。如果您使基本身份验证无效,您可能(可能需要检查它以 100% 确定)仍然使用 JWT 令牌访问应用程序,直到它过期。

不要相信我的话。只需检查 JWT 令牌过期后您是否仍然可以访问应用程序以及 JWT 令牌会发生什么。

我曾经使用 JSESSIONID 进行基本身份验证和正常身份验证。混合也不起作用。

【讨论】:

如果 jwt 不仅由用户凭据生成,而且由 id 和凭据生成,那么使用这两种安全方式仍然太糟糕了? id是怎么传的?是用户提供的东西吗?它是从数据库中自动获取的吗? 它在获取请求的 URL 中作为值传递 恕我直言,这并没有太大变化。攻击者可以像普通用户一样使用这个 id 字段。

以上是关于REST 安全性,使用基本身份验证和 jwt 令牌验证是一种不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 HTTP 基本身份验证获取 JWT 令牌的安全性如何?

Django Rest Framework 不接受 JWT 身份验证令牌

使用 jwt 令牌的 Django API Rest Framework 和 Angular 7 身份验证

使用 Django Rest 框架进行 JWT 令牌身份验证

如何在 vue 中存储、管理 REST API JWT 身份验证令牌?

带有 jwt 身份验证的 django rest api 要求 csrf 令牌