Cookie、Session、Token

为什么会需要cookie、session、token?

  • Http协议是无状态的协议,因此,需要各种通行证来证明身份,每次客户端和服务端会话完成时,服务端不会保存任何会话信息:每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我),就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器。所以就需要cookie和session去实现。

Cookie

cookie存储在客户端的浏览器中,cookie是服务器产生并发送到用户浏览器并保存在本地的一小块数据,在浏览器下一次访问同一服务器时候被携带放在请求头中发送到服务器上。相当于钥匙,服务端用于验证钥匙是不是正确的,cookie不可以跨域,不同的域名绑定不同的cookie。
cookie格式:key:value;key:value;key:value;

Session

session是另一种记录服务器和客户端会话状态的机制
首先、session是基于cookie来实现的,session同样也存储在服务端,sessionid会被存储到客户端的cookie中,也就是说服务端产生sessionid然后通过传送cookie的方式传送到客户端。

  • 用户首次请求服务器时,服务器根据用户提交的相关信息(用户信息+浏览器信息+网址信息等)创建对应的session,生成sessionid,请求响应返回时将此sessionid返回给浏览器。
    浏览器接收到服务器返回的SessionID之后,会将sessionid存储在浏览器的cookie中,同时记录了这个session属于哪个域名(服务端)
  • 用户第二次访问服务器时,请求会自动判断此域名下是否存在cookie,如果存在,在发送请求时会自动在请求头中加入cookie一起发送到服务器,服务端从cookie中获取sessionid,根据sessionid查找session信息,没找到则说明没有登录或已经失效,如果找到则证明已经登录,可以执行后续操作。

Cookie和Session的区别

安全性:

Session相对更加安全,Session是存储在服务端的,Cookie是存储在客户端的。

存储值不同:

Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session有一定的存储空间,可以存储当前登录的用户信息, 可以存任意数据类型。

有效期不同:

Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效,session默认过期时间为30分钟。修改的话可以在yml文件中设置:server.servlet.session.timeout = 3600

存储大小不同:

单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。

Token令牌

Token值介绍
token 值: 登录令牌.利用 token 值来判断用户的登录状态.类似于 MD5 加密之后的长字符串.
用户登录成功之后,在后端(服务器端)会根据用户信息生成一个唯一的值.这个值就是 token 值.
基本使用:
在服务器端(数据库)会保存这个 token 值,以后利用这个 token 值来检索对应的用户信息,并且判断用户的登录状态.
用户登录成功之后,服务器会将生成的 token 值返回给 客户端,在客户端也会保存这个 token 值.(一般可以保存在 cookie 中,也可以自己手动确定保存位置(比如偏好设置.)).
以后客户端在发送新的网络请求的时候,会默认自动附带这个 token 值(作为一个参数传递给服务器.).服务器拿到客户端传递的 token 值跟保存在 数据库中的 token 值做对比,以此来判断用户身份和登录状态.
判断登录状态:
如果客户端没有这个 token 值,意味着没有登录成功过,提示用户登录.
如果客户端有 token 值,一般会认为登录成功.不需要用户再次登录(输入账号和密码信息).
token 值扩展:
token 值有失效时间:
一般的 app ,token值得失效时间都在 1 年以上.
特殊的 app :银行类 app /支付类 app :token值失效时间 15 分钟左右.
一旦用户信息改变(密码改变),会在服务器生成新的 token 值,原来的 token值就会失效.需要再次输入账号和密码,以得到生成的新的 token 值.

唯一性判断: 每次登录,都会生成一个新的token值.原来的 token 值就会失效.利用时间来判断登录的差异性.

Token和Session的区别

Session 是一种记录服务器和客户端会话状态的机制,使服务端有状态化,可以记录会话信息。而 Token 是令牌,访问资源接口(API)时所需要的资源凭证。Token 使服务端无状态化,不会存储会话信息。
Session 和 Token 并不矛盾,作为身份认证 Token 安全性比 Session 好,因为每一个请求都有签名还能防止监听以及重放攻击,而 Session 就必须依赖链路层来保障通讯安全了。如果你需要实现有状态的会话,仍然可以增加 Session 来在服务器端保存一些状态。

总结

在实际应用场景中各类系统的登录功能中用到以上三种的都有,并不会有一定之规,虽然这三种在实现上有所不同,但是原理上比较相近,在选择用那种技术来实现自己的登录系统时需要根据实际场景来选择。但是最起码要明白这三种方式的原理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智博的自留地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值