关于token

token即标志、记号的意思,在IT领域也叫作令牌。在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思,一般作为邀请、登录系统使用

Token可以解决那些问题

  1. 服务端不用存储用户信息,也就没有分布式存储问题,也不用为了认证上Redis集群
  2. 前端存储token可以灵活掌控,也可以支持跨域访问
  3. 更适用于移动端(Android,iOS,小程序等等),像这种原生平台不支持cookie
  4. 不依赖cookie,可以避免CSRF跨站伪造攻击

Token认证流程


token 的流程是这样的:

  • 用户登录,服务端校验账号密码,获得用户信息
  • 把用户信息、token 配置编码成 token,通过 cookie set 到浏览器
  • 此后用户请求业务接口,通过 cookie 携带 token
  • 接口校验token有效性,进行正常业务接口处理

Token安全

  • 使用HTTPS传输
  • node 端的 cookie-session - npm 库来编码token
  • token涉及敏感权限,使用token 加数字签名的方式来避免token被篡改
  • 使用JWT生成和认证token

Token客户端存储

  • SessionStorage安全性较高,能比较好防御CSRF,但是对XSS无用,且局限较大
  • LocalStorage和IndexDB受同源保护,但是一旦被注入脚本也很危险
  • USB Key安全性较高,属于物理级别的防御,但是有一定的成本
  • Cookie最方便,但是默认状态下最不安全,需要将http-only,same-site,secure等开启才能有较高的安全性

JWT

JWT生成token原理


https://jwt.io
jwt生成的token是由三段字符串组成,并且用.连接起来

  1. 第一段字符串header,内部包含算法和token类型,如:{ “alg”: “HS256”,”typ”: “JWT”},将json转换为字符串后用Base64URL加密得到
  2. 第二段字符串payload,自定义值,一般存储用户信息,token超时时间等 如:{“sub”: “1234567890”,”name”: “John Doe”,”iat”: 1516239022},将json转换成字符串后用Base64URL加密得到
  3. 第三段字符串对前两部分签名,防止数据篡改
    首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。
    HMACSHA256( base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret)

jwt认证

  1. 获取客户端传过来的token,并用 “.” 切割得到三段字符串
  2. 对第二段字符串Base64URL解密,获取payload信息,检查token是否过期
  3. 将第一段密文和第二段密文拼接起来,使用生成token的Header里面的签名算法加密+生成token的密钥(secret)
  4. 将第三段密文和第3步得到的密文字符串对比

jwt被盗了会发生什么

简而言之:它很糟糕,真的很糟糕

  • 攻击者能一直使用您的JWT 访问该服务,直到它过期;能做的是生成jwt的时候让他的有效期短一些,但是如果攻击者通过中间人连接或者直接连接客户端或者你的服务器,这时候即使最短寿命的jwt也无济于事
  • jwt被盗的风险比丢失用户名和密码风险更大,用户名和密码登录往往还有其他的认证保护
  • 你很难知道你的用户jwt被盗了

jwt了被盗了怎么做

  1. 立即撤销受损的令牌。如果您在服务器上使用撤销列表来使令牌无效,则撤消令牌可立即将攻击者从系统中启动,直到他们获得新令牌为止。虽然这是一个临时解决方案,但它会让攻击者的生活变得更加困难。
  2. 强制您的客户立即更改密码。在Web或移动应用程序的上下文中,强制您的用户立即重置其密码,最好通过某种多因素身份验证流程,如Okta提供的那样。如果攻击者试图使用受感染的令牌修改用户登录凭据,则强制用户更改其密码可能会使攻击者远离其帐户。通过要求多因素身份验证,您可以更自信地重置其凭据的用户是他们所声称的人而不是攻击者。
  3. 检查客户的环境。用户的手机是否被盗,以便攻击者可以访问预先认证的移动应用程序?客户端是否从受感染的设备(如移动电话或受感染的计算机)访问您的服务?发现攻击者如何获得令牌是完全理解错误的唯一方法。
  4. 检查您的服务器端环境。攻击者是否能够从您的角色中妥协令牌?如果是这样,这可能需要更多的工作来修复,但越早开始就越好。