我的项目需要做一个用户登录模块,接口是restful风格的,某些接口需要带上用户id查询。我想过使用session-cookie、jwt等方式,不想一尘不变,所以来问题下采用哪种方式比较有意思,个人项目,不怕踩坑
看了jwt之后,不是很理解接口无状态
- jwt是将用户信息加密成一个字符串存放在用户手中
- 用户带着加密字符串请求服务器
- 服务器解密字符串获取用户信息(被加密的就是用户信息)
- 鉴权完成,用用户信息做后续操作
cookie-sesion不安全,未加密的信息被存储在用户手中
jwt里存储的用户信息并没有加密,只是base64转码而已。 jwt这个串整体上是加密的,伪造不了,要不然服务器解密不了。无状态可以理解为服务器端没有存储任何数据,客户端传输一个jwt串,服务端能解密出来,知道这个用户是谁。
cookie-session的话 也不能说不安全,服务器会生成一个sessionID, 然后外加一些用户信息,比如用户ID存在内存或者数据库里,这就是有状态了,可以再通过一个加密算法加密sessionID,生成cookie返给客户端。客户端每次请求都带上cookie, 服务端解密后得到sessionID,再去查询这个用户是谁。
JWT确实无需在服务端保存用户信息,可以把userId之类保存在token中,确实可以无状态,但像强制下线,多设备登录等还是需要服务端保存状态。
来自酷炫的 CNodeMD
@liuzhiguo11 这样说好像理解了
jwt: 一般将用户id和exp,然后通过加密给用户,用户在拿到后存储到本地比如session、cookie、localstorage,在需要鉴权的请求的时候携带token到服务器,服务器拿到这个token后,解析,如果解析通过,且没有超时就认为是一个合法用户,反正则非法。