我最近开始学习 React Native,想要自己搭建一个小项目,后端是用 Rails API。因为是第一次做 API,所以也对 Token Authentication 不太熟悉。
我在网上也看了几个不同的教程,每个人做法都不太一样,有些人甚至把 Token 储存在数据库里,可是据我所知,后端是不该保存 Token 的。
所以我想请问各位,到底怎么样才是正确地方法?
Token 要保存的,其实就是用它来做 key 来取用户信息。这种方式最好使用 https 连接。
用 JWT 的话不用保存 Token,甚至不用 https 也是安全的。
JWT 作为传输的包,验证内容还是建议用 token,不然 JWT 无法失效。
另外我看很多 JWT 实现只有 JWS(sign)没有 JWE(encrypt),要注意是否符合自己的安全要求。
就算有 JWE,没有 HTTPS 一样会被劫持。
就算有 JWE,没有 HTTPS 一样会被劫持。
做用户验证的话被劫持后的效果是一样的,所以还是需要 HTTPS 更安全。所以我的说法有误。
JWT 作为传输的包,验证内容还是建议用 token,不然 JWT 无法失效。
失效可以通过设置的失效时间来确定。如果只用 JWT 作为传输感觉就没有必要了,那还是使用普通的 Token + HTTPS 的机制就好了。
另外搜了下,感觉 JWT 还是一个饱受争议的技术: https://news.ycombinator.com/item?id=13865459 。
如果服务器端持久化 Token,那 JWT 提供的种种机制就都没必要存在了,JWT 为了载荷的安全(不考虑劫持)还要搭配 JWE 使用,很多时候想清楚就发现是多此一举。
但是多站点做数据共享(或者说 SSO)的情况下,JWT 还是有用武之地的
是否可以在 payload 加一个字段,放与密码相关的哈希,当用户重置密码后,之前的 token 就失效了。也不需要持久化 token。
感觉账号被盗用后应该通过“锁定账号”的机制来提升安全。我们常用的银行或者其它系统都是这么处理的。
比如账号密码被盗了,只删除现有 Token,盗用者只要重新登录就可以了。
如果一定要提升安全的话,其实还是有可行的方法的。我现在能想到的比如也可以通过“锁定并强制重置密码 + 一个过期周期内强制使用账号密码登录”实现。
另外如果单纯从安全角度考虑,在数据库中存储 Token 如果被攻击者爆库的话,那造成的损失要比不存储的方式要大。但是很显然,人们认为自己被爆库的可能性要低,所以大多数还是会选择存储 Token 的方案。