彻底搞懂Cookie和session和token的区别和作用

首先理解B/S架构和C/S架构

B/S:浏览器与客户端,浏览器:browser,

C/S:服务端与客户端,服务端:server,客户端:client

Cookie:存储在客户端的,客户端专门存东西的一个标识。

特点:1,能存储的东西很少,基本上只能存储4k左右的东西

           2,存储在浏览器,能被手动清除,有效期不高,正常没有操作后20分钟后就被清除

           3,Cookie安全问题,别人能从本地Cookie中获取信息

           4,Cookie不能直接存储中文,如果需要,则需要进行url转码

String value="你好";
//转码
value=URLEncoder.encode(value,utf-8)
Cookie co=new Cookie("key",value)
//解码
value=URLEncoder.decode(value,utf-8)

流程:客户端A访问服务器,服务器返回cookie给客户端A,客户端A存储cookie,下次需要带着cookie访问服务器,服务器返回相应的数据。

response.add()     服务端

Session:存储在服务器端的,服务端专门存东西的一个标识。

特点:1,安全性:Session的安全性比Cookie的安全性要高

           2,性能:当服务器访问较多,比较占用性能

           3,生命周期:异常关机会造成Session的销毁,默认存储30分钟

           4,Session的钝化以及活化

                钝化:服务器正常关闭后,tomcat会自动将Session数据写入硬盘的文件中

                活化:服务器再次启动后,从文件中加载数据到Session中

           5,浏览器关闭后再次重启SessionId的地址值不为同一个

           4,访问范围:Session为一个浏览器共享

                                   Cookie为多个浏览器共享

流程:客户端A访问服务器,服务器存储A的数据value,把key返回给客户端A,客户端A下次带着key(session ID)来访问服务器,服务器就能给出客户端A的数据。如果负载均衡,客户端A访问了另一个服务器,那个服务器没有客户端A的数据。

token:开发定义的,和Session有点相像

特点:1,开发定义的,Session是Http协议规定的

           2,token不一定存储,Session存储于服务器

           3,token可以跨域,Session不一定能跨域,会与域名绑定

客户端A访问服务器,服务器给了客户端token,客户端A拿着token访问服务器,服务器验证token,返回数据。

基于 Session

基于 session 的认证中,用户登录后服务器会为登录用户创建一个 session,Cookie的验证是有状态的,sessionid 会保存在用户浏览器的 cookie 中。当用户登录成功后,cookie 会随着后边的每个请求一起发送。这样,服务器通过 cookie 中的 sessionid 找到内存中的 session 数据,来验证用户身份,从而在响应中返回相应的状态。

流程:

1.客户端发送一个http请求带着用户名密码到服务器端

2.服务器端接受了客户端请求后,建立一个session,并发送一个http响应到客户端,这个响应头包括

 set-cookie的格式如下 Set-Cookie:value [ ;expire=date ][ ;damain=domain ][ ;path=path ][ ;secure ]

3.客户端发起第二次请求,服务器已经给了setcookie,浏览器自动在请求头上获取到cookie并分解 验证信息成功后返回respense给客户端

 Session的弊端:

        1,Session是服务端存储的一个对象,主要用来存储所有访问过该服务端的客户端的用户信息(也可以存储其他信息),从而保持用户会话状态。但是当服务器重启后,内存会被销毁,存储的用户信息也就消失了

        2,不同的用户访问服务端的时候会在Session中存储键值对,键用来开启用户登录的钥匙,登录成功后,钥匙通过Cookie返回给客户端,客户端存储为Sessionid存储在Cookie中,客户端在次访问时会携带Cookie中的Sessionid进行访问

        3:Session是基于Cookie的

                1.Cookie的数据是4k左右

                2.Cookie的存储格式是Key-Value

                3.Cookie的有效期:可以自行通过,如果没设置,默认浏览器关闭后失效

1)将期限设置为当前日期后的第N天的0时0分0秒

Response.Cookies(“LastView”).Expires=dateadd(“d”,N,date)

      4.Cookie的有效范围:当前域名范围下有效,(当前后端项目协议一致,域名,端口号都一致,即在同一个项目下)

                5.session持久化,用于解决重启服务器后session就消失的问题。在数据库中存储session,而不是存储在内存中。通过包:express-mysql-session

                6.当客户端存储的cookie失效后,服务端的session不会立即销毁,会有一个延时,服务端会定期清理无效session,不会造成无效数据占用存储空间的问题。

基于 Token   

很多网络应用使用 json web token 也即 JWT 来代替 session 实现身份认证。在这种基于 token 的应用中,服务器使用一个密钥来创建 jwt 并发送给客户端。客户端会保存此 jwt(通常保存在本地存储 local storage 中)并在每个请求的 header 中包含此 jwt。服务器验证客户端发来的每个请求中的 jwt ,做出响应。 token 的验证是无状态的,存储在 Authorization Header 中进行验证,形式是Bear{ JWT }

它与 session 方式最大的不同是用户状态不存储在服务器端,而是存储在 token 中并保存在客户端。为了扩展性,大部分现代网络应用都使用 jwt 来进行用户认证。

token的组成一般是   uid(用户唯一身份标识)+time(时间戳)+sign(签名使用hash压缩成固长的十六进制字符串 防止第三方恶意拼接)+固定参数可选

1.用户登录,成功后服务器返回Token给客户端

2.客户端收到数据后保存在客户端

3.客户端再次访问服务器,将token放header中

4.服务器采用filter进行过滤校验,成功返回请求数据,校验失败返回错误码

  • 适用于项目级的前后端分离(前后端代码运行在不同的服务器下)

    请求登录时,token和sessionId原理相同,是对key和key对应的用户信息进行加密后的加密字符,登录成功后,会在响应主体中将{token:'字符串'}返回给客户端。客户端通过cookie、sessionStorage、localStorage都可以进行存储。再次请求时不会默认携带,需要在请求拦截器位置给请求头中添加认证字段Authorization携带token信息,服务器端就可以通过token信息查找用户登录状态。

 

 扩展性

基于 session: 由于 session 存储于服务器端(一般是内存型数据库,如 redis),当用户量很大时会有一定的扩展性问题。
基于 token: 存储在客户端,不存在上边这个问题。

token可以抵抗csrf(跨域请求伪造),更安全,使用cookie在post请求的同时会自动添加到请求头上,token则不会自动添加到请求头中,

攻击者也无法访问用户的token,无法形成攻击。

多设备

基于 session: cookie 通常工作在单个域名或其子域名下,而且跨域名时通常会被浏览器关闭。当 API 要服务于不同域名的移动和网络设备时,容易出现问题。
基于 token: 由于 jwt 包含于请求头当中,不存在 cookie 引发的相关的问题。

翻译自:Session vs Token Based Authentication

摘于彻底搞懂Token、Session和Cookie - 走看看

关于 jwt 的更多信息,可以参考阮一峰的文章《Json Web Token 入门教程》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值