浅谈Token、Session和Cookie

在开发 java web项目过程中离不开用户的登录操作,常见的基本操作是,用户每次登录给服务器传递用户名和密码,服务器收到后再去存储结构中查询,进行验证。

Session

上述过程中存在着无法管理会话的问题,因此使用会话标识(session)解决这个问题。当有客户端连接到服务器时,需要保持用户的登录状态,并且可以把每个用户区分开。用户在访问服务器时,将这个session id一起传递给服务器。

注:Session在用户第一次访问服务器的时候自动创建。Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

Token

但是这样同样存在这一些问题:

当用户数量上升时,服务器需要保存所有用户的session id,这对服务器来说会造成很大的负载压力,并且限制了服务器的扩展能力,当多台服务器存在时,需要服务器之间反复同步数据,来保证用户的实时在线验证。

上述问题的关键是服务器在维护所有与其连接的会话标识,解决思路是能不能让客户端自己保存自己的id,这样的解决方案就是token的工作原理,以用户F为例:

用户F登录了系统,给他发一个令牌(token),里面包含F的user id来标识用户身份,F再次登录时,只需要把token带来即可,为了安全起见,token是服务器把用户数据加密处理后用密钥对其进行签名,由于密钥不公开,因此其他人无法伪造token。

下次在F登录时,多传递一个token,这个token服务器不保存,服务器只需要用密钥和F提交的数据进行加密并签名,与F带来的token对比即可。

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。

总结起来就是,服务器使用计算Token的时间来换取存储Session的空间

Cookie

Cookie是缓存数据,存储在客户端,Cookie具有不可跨域名性,是服务器存储在本地计算机的小块文本,相较于session不安全,单个大小有限制(4k)

补充

Session 是一种HTTP存储机制,目的是为无状态的HTTP提供的持久机制。所谓Session认证只是简单的把User信息存储到Session里,这是一种认证手段。

而Token,提供的是认证和授权,认证是针对用户,授权是针对App。其目的是让某App有权利访问某用户的信息。这里的Token是唯一的。不可以转移到其它App上,也不可以转到其它用户上。

所以简单来说,如果你的用户数据可能需要和第三方共享,或者允许第三方调用API接口,用Token。如果永远只是自己的网站,自己的App,用什么就无所谓了。

参考资料:

彻底理解cookie,session,token

cookie和session的详解与区别

Token、Cookie和Session的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值