token过期问题,为什么不能把token放入cookie时设置过期时间呢?

各位大佬,小弟是新手,想请教几个问题?

  1. 最近写登录模块的时候,看到别人的代码都是在redis中设置session的过期时间,然后将session_id设置到cookie中,我想询问一下,能否将session_id放入cookie中并设置过期时间呢?过期由前端进行控制,后端redis不设置过期时间,这样除了会对redis的容量造成浪费,有其他原因吗?
  2. cookie是否可以被前端修改?我将用户的所有信息放入cookie中,用户下次登录,后端直接判断cookie有没有用户信息,有则登录,没有则表明未登录,这样是否可行?
  3. 如果用户的密码也被放入了cookie中了,但我是用盐+md5加密的,这样只有加密后的密码应该也破解不了吧,这样直接将密码放入cookie中有安全性问题吗?

这些只是自己对于知识了解不够,而产生的疑惑,还请各位大神传道解惑。

可以实现

  1. 用户的密码信息不能存放在Token,一般只存储用户的ID之类信息
  2. Cookie要记的设置 HttpOnly属性,禁止客户端读写

有种东西叫做 JWT,你可以去了解一下

大牛,非常感谢您的回复,也就是说,如果我设置了httponly,不允许客户端读写,然后我只将用户的id存在cookie中,今后的判断只通过检测cookie中的id是否存在来判断是哪个用户登录,或者用户是否登录,这种方式也可行,是吗

还要添加一个东西,签名。用来防止别人伪造Token。

如果是url中携带token,那可能会伪造token,如果只是单纯cookie中设置,如果设置了httponly,不是不允许修改吗?那也可以伪造吗?(可能我了解的比较局限,大牛莫怪)

当然可以,客户端不仅仅是浏览器。我通过F12或者其他抓包方式,看到你的Cookie信息。找到了你Token的构造格式,那么我自己就可以伪造。我不用浏览器,自己写程序去请求。就可以欺骗服务器了。

所以你的Token最后一定要加上服务端的签名,这个是没有办法伪造的。

而且你想的这些,其实早就有人给你实现了。JWT,就是这样设计的。你可以去研究一下,很简单。

大牛,非常感谢,我明白了,您第一次回复我的时候,我就去看了JWT了,只是没搞懂为什么这样设计,我以为设置了cookie的httponly,就谁也动不了了,原来还可以通过抓取cookie然后通过程序伪造,是我了解的太片面了,非常感谢大牛。

1 个赞

大牛,再打扰您一下,我学习了一下JWT,那我想了一下,JWT的三段式的token如果被抓包看到了,那恶意程序带着这个三段式的token去请求服务器,那不是也可以欺骗服务器吗?那感觉怎么也防不住恶意程序啊,无论用什么加密,被抓包抓到了,带着这个token请求,那感觉怎么也防不住啊

首先,只要你不泄露你服务端的密钥,别人就没法伪造Token。这点安全了。

虽然没法主动伪造,但是可能窃取你的合法Token。这个Token是在你的电脑上。除了你别人看不到。被人想拿到的话,有几种可能

1. 有人拿枪逼着你把你的Token给他

这个,没辙

2. 他有网络控制权,例如,路由器。可以通过抓包抓到数据

这种方式,你可以为你的应用添加SSL证书,SSL通信是加密的。就算别人抓包到数据也没法破解

在保证了Token的安全后,你一般还需要为Token设置一个过期时间,不能是永久有效的。而且定期更换密钥。

如此,几乎不会什么安全问题。

1 个赞

明白了,非常感谢大牛耐心解答