为何说 Token 是 restful,而Cookie/SessionID 则不是?
如果SessionID和Token都存在 redis 里让多个服务器共享
那没什么区别吧?
关于有无状态和是否restful
他们都需要在服务端保存信息,我觉得都是stateful
为何有的说Token就是stateless和restful,而Cookie/SessionID 则不是?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
很多人是按session的方式来使用token,所以觉得两者一样。
session思维是这样:传递sessionID或者所谓的token到服务端,然后服务端根据这个键值找到用户数据,也许是session文件,也许在redis里,然后读取里面的数据uid=1,至此用户身份确立。
而真正的token思维是这样:uid=1直接保存在客户端,当然不会只保留这么简单的数据,很容易伪造。实际保存数据可能是这样uid=1|6166b2002fdcb5df,后面一部分签名是根据第一部分数据加密所得,而加密算法只有服务端知道,你就没办法伪造数据了。服务端获取这个token后,对第一部分数据验签,和第二部分比对,如果一致,直接确立用户身份uid=1。整个操作直接在内存中运算,不需要读取session文件或redis。你甚至可以把整个用户信息uid=1&nickname=xxx&money=1000保存到token里。
比如常用的JWT,是用 . 分割成3部分,每部分再base64_encode,但思路是一样的。
问题的出处在哪里?谁这么说了?表示疑问。。
RESTful 的定义里有关于 token 的说法?
说我的理解吧,不管是 token 还是 session 都只是标识请求来源,是哪个用户请求的。
换种说法,网站的 api 实现,我明明可以用 session 的为什么要有 token ?多此一举 。
不管token很是session_id原理上都是差不多的,token通常是放在接口直接请求,token通常是放在header中进行请求,不管怎么样都需要前后端发起数据交互。不管用token还是session,都没大关系,只要能实现即可。
可以看下jwt这种token,是不需要存在服务器的,所有认证信息(用户id,过期时间等)是被加密在token当中的,在服务端解密token就可以获取认证信息,不像session需要在服务器那里,根据cookie来取回状态。
至于安全问题,jwt+https基本是很安全的了。这种stateless的token还有个好处是他可以无痛拓展,因为session的文件是存放到磁盘上的,当你有第二台服务器时,为了共享登陆,你不得不把session文件转移到redis或其他介质上,而jwt本身自带所有认证信息,直接使用
虽然我不是大神,但是可以介绍一个大神
Token 认证的来龙去脉 segmentfault.com/a/1190000013010835 by 边城
RESTful
的定义是无状态,token
更符合这一点,每次请求都传递参数token
,无状态的交互形式。而我们都知道
http
是无状态的,所以每次都要带上状态去请求服务器也就是Cookie/SessionID
,cookie
机制采用的是在客户端保持状态的方案,而session
机制采用的是在服务器端保持状态的方案。