相关疑难解决方法(0)

服务器端处理JWT令牌的最佳实践

(从这个线程产生,因为这实际上是一个问题,而不是NodeJS等)

我正在实现一个带有身份验证的REST API服务器,并且我已经成功实现了JWT令牌处理,以便用户可以使用用户名/密码通过/ login端口登录,在该端点上从服务器机密生成JWT令牌并返回到客户.然后,令牌在每个经过身份验证的API请求中从客户端传递到服务器,然后使用服务器机密来验证令牌.

但是,我正在努力了解有关如何以及在何种程度上验证令牌的最佳实践,以构建真正安全的系统.究竟什么应该参与"验证"令牌?是否可以使用server-secret验证签名,还是我还应该针对存储在服务器中的某些数据交叉检查令牌和/或令牌有效负载?

基于令牌的身份验证系统只会像在每个请求中传递用户名/密码一样安全,前提是获取令牌与获取用户密码相同或更困难.但是,在我看过的例子中,生成令牌所需的唯一信息是用户名和服务器端秘密.这不意味着假设一分钟恶意用户获得服务器机密的知识,他现在可以代表任何用户生成令牌,从而不仅可以访问一个给定用户,如果密码是获得了,但事实上对所有用户帐户?

这让我想到了一些问题:

1)JWT令牌验证是否应限于验证令牌本身的签名,单独依赖服务器机密的完整性,还是附带单独的验证机制?

  • 在某些情况下,我已经看到了令牌和服务器会话的组合使用,在成功登录/ login端点后会建立会话.API请求验证令牌,并将令牌中找到的解码数据与会话中存储的某些数据进行比较.但是,使用会话意味着使用cookie,并且在某种意义上它违背了使用基于令牌的方法的目的.它也可能导致某些客户出现问题.

  • 可以想象服务器将当前正在使用的所有令牌保存在内存缓存或类似内容中,以确保即使服务器机密被泄露,以便攻击者可以生成"有效"令牌,只有通过/ login端点生成的确切令牌会被接受.这是合理的还是只是多余/过度杀伤?

2)如果JWT签名验证是验证令牌的唯一方法,意味着服务器机密的完整性是一个突破点,那么应该如何管理服务器机密?从环境变量读取并在每个部署的堆栈中创建(随机化?)一次?定期重新创建或轮换(如果是这样,如何处理在轮换之前创建但需要在轮换之后进行验证的现有有效令牌,如果服务器在任何给定时间保持当前和之前的秘密,则可能就足够了) ?别的什么?

当谈到服务器机密被泄露的风险时,我可能只是过于偏执,这当然是一个需要在所有加密情况下解决的更普遍的问题......

security authentication token secret-key jwt

109
推荐指数
4
解决办法
4万
查看次数

在基于浏览器的应用程序中保存JWT的位置以及如何使用它

我正在尝试在我的身份验证系统中实现JWT,我有几个问题.要存储令牌,我可以使用cookie,但也可以使用localStoragesessionStorage.

哪个是最好的选择?

我已经读过JWT保护网站免受CSRF的侵害.但是,我无法想象假设我将JWT令牌保存在cookie存储中会如何工作.

那么它将如何保护CSRF?

更新1
我看到了一些使用示例,如下所示:

curl -v -X POST -H "Authorization: Basic VE01enNFem9FZG9NRERjVEJjbXRBcWJGdTBFYTpYUU9URExINlBBOHJvUHJfSktrTHhUSTNseGNh"
Run Code Online (Sandbox Code Playgroud)

当我从浏览器向服务器发出请求时,如何实现?我还看到有些人在URL中实现了令牌:

http://exmple.com?jwt=token
Run Code Online (Sandbox Code Playgroud)

如果我通过AJAX发出请求,那么我可以设置一个标题jwt: [token],然后我可以从标题中读取标记.

更新2

我安装了高级REST客户端谷歌浏览器扩展,并能够将令牌作为自定义标头传递.在向服务器发出GET请求时,是否可以通过Javascript设置此标头数据?

javascript security cookies web-services jwt

41
推荐指数
5
解决办法
3万
查看次数