Anti-CSRF令牌是存储在客户端,服务器端还是在两者上?

时间:2018-10-12 02:56:56

标签: session cookies jwt xss csrf

我正在创建一个带有Node.js后端的React Js网站。我一直在尝试找出一种用户身份验证实施方案来防止CSRF攻击,但是我对在哪里存储Anti-CSRF令牌感到困惑。

我对安全实施的思考过程如下...

  1. 用户提交使用凭据登录的请求。
  2. 凭据已通过身份验证。
  3. 服务器创建会话。
  4. 服务器创建JWT以用作反CSRF令牌。
  5. 服务器将JWT(反CSRF令牌)存储在会话存储中。
  6. 服务器将响应发送到客户端。
    • 响应具有标头,用于将会话ID存储在客户端的HttpOnly cookie中。
    • 响应有效负载包括JWT(反CSRF令牌)。
  7. 客户收到响应。
  8. HttpOnly Cookie保存会话ID存储在客户端。
  9. 客户端将JWT(反CSRF令牌)存储在localStorage中。

我认为当用户需要请求信息时,客户端可以通过标头或有效负载发送JWT(反CSRF令牌),并且由于它是cookie,因此会话ID将自动发送。然后,服务器可以检查会话存储中是否存在JWT(反CSRF令牌)。

我知道JWT(反CSRF令牌)将需要在某个时候刷新。

我的困惑是由于在客户端存储了JWT(反CSRF令牌)。我一直在阅读它应该只存储在服务器上。但是,如果仅将其存储在服务器上,那么它似乎根本不做任何事情。

我考虑同时使用cookie和localStorage,因为似乎到服务器的请求既需要HttpOnly cookie,又需要来自localStorage的东西才能发送回“授权”响应,则攻击者既需要成功进行会话,又需要成功实施XSS攻击以获得Anti-CSRF令牌。

我最近才刚刚开始学习CSRF和XSS,所以我可能完全错了,我的实现中可能存在一个巨大的缺陷,我很想念。但是我的主要问题是...不需要在客户端和服务器上存储反CSRF令牌吗?

1 个答案:

答案 0 :(得分:0)

它们也称为“ CSRF令牌”。当客户请求表格时(例如银行登录页面),服务器会生成令牌并将其传递给客户,当客户填写表格时,客户会将CSRF令牌与填写好的表格一起传递。服务器验证令牌值,如果匹配,则请求得到满足。 CSRF令牌以同步器令牌模式存储在服务器端。