session、cookie、token之间的关系和区别

session、cookie、token之间的关系和区别

1.session存储于服务器,可以理解为一个状态列表, 有如用户信息档案表, 里面包含了用户的认证信息和登录状态等信
息,拥有一个唯一识别符号sessionId,通常存放于cookie中。服务器收到cookie后解析出sessionId,再去session列表
中查找,才能找到相应session。依赖cookie,虽然是最常用的,但并不是唯一的方法。禁用cookie后还有其他方法存
储,比如放在url中;

2.cookie类似一个令牌, cookie 就是用户通行证,装有sessionId,存储在客户端,浏览器通常会自动添加。

3.token也类似一个令牌,无状态,用户信息都被加密到token中,服务器收到token后解密就可知道是哪个用户。需要
开发者手动添加。依赖cookie、localstorage、sessionStorage

4.jwt只是一个跨域认证的方案

HTTP协议是无状态的协议。

什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。这种无状态的的好处
是快速。

cookie和session

由于http的无状态性,为了使某个域名下的所有网页能够共享某些数据,session和cookie出现了。

session机制下客户端访问服务器的流程如下

1.首先,客户端会发送一个http请求到服务器端。
2.服务器端接受客户端请求后,建立一个session,并发送一个http响应到客户端,这个响应头,其中就包含Set-Cookie	
头部。该头部包含了sessionId。Set-Cookie格式如下,具体请看Cookie详解:
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
3.在客户端发起的第二次请求,假如服务器给了set-Cookie,浏览器会自动在请求头中添加cookie
4.服务器接收请求,分解cookie,验证信息,核对成功后返回response给客户端

注意

1.cookie只是实现session的其中一种方案。虽然是最常用的,但并不是唯一的方法。禁用cookie后还有其他方法存储,
比如放在url中;
2.现在大多都是Session + Cookie,但是只用session不用cookie,或是只用cookie,不用session在理论上都可以保持
会话状态。可是实际中因为多种原因,一般不会单独使用;
3.用session只需要在客户端保存一个id,实际上大量数据都是保存在服务端。如果全部用cookie,数据量大的时候客户
端是没有那么多空间的;
4.如果只用cookie不用session,那么账户信息全部保存在客户端,一旦被劫持,全部信息都会泄露。并且客户端数据
量变大,网络传输的数据量也会变大;

token

token 也称作令牌,由uid+time+sign[+固定参数],token 的认证方式类似于临时的证书签名, 并且是一种服务端无状态
的认证方式, 非常适合于 REST API 的场景. 所谓无状态就是服务端并不会保存身份认证相关的数据。

token组成

uid: 用户唯一身份标识
time: 当前时间的时间戳
sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接
固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库

存放

token在客户端一般存放于localStorage,cookie,或sessionStorage中。在服务器一般存于数据库中。

token认证流程

用户登录,成功后服务器返回Token给客户端。
客户端收到数据后保存在客户端
客户端再次访问服务器,将token放入headers中
服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码

token可以抵抗csrf,cookie+session不行

因为form 发起的 POST 请求并不受到浏览器同源策略的限制,因此可以任意地使用其他域的 Cookie 向其他域发送 
POST 请求,形成 CSRF 攻击。在post请求的瞬间,cookie会被浏览器自动添加到请求头中。但token不同,token是开
发者为了防范csrf而特别设计的令牌,浏览器不会自动添加到headers里,攻击者也无法访问用户的token,所以提交的
表单无法通过服务器过滤,也就无法形成攻击。

分布式情况下的session和token

我们已经知道session是有状态的,一般存于服务器内存或硬盘中,当服务器采用分布式或集群时,session就会面对负
载均衡问题。

负载均衡多服务器的情况,不好确认当前用户是否登录,因为多服务器不共享session。这个问题也可以将session存在
一个服务器中来解决,但是就不能完全达到负载均衡的效果。当今的几种解决session负载均衡的方法。

而token是无状态的,token字符串里就保存了所有的用户信息

客户端登陆传递信息给服务端,服务端收到后把用户信息加密(token)传给客户端,客户端将token存放于
localStroage等容器中。客户端每次访问都传递token,服务端解密token,就知道这个用户是谁了。通过cpu加解密,
服务端就不需要存储session占用存储空间,就很好的解决负载均衡多服务器的问题了。这个方法叫做JWT(Json Web Token)

补充:JWT

JWT就是token的一种实现方式,并且基本是java web领域的事实标准。

JWT全称是JSON Web Token。基本可以看出是使用JSON格式传输token

JWT 由 3 部分构成:

Header :描述 JWT 的元数据。定义了生成签名的算法以及 Token 的类型。Payload(负载):用来存放实际需要传递的
数据Signature(签名):服务器通过Payload、Header和一个密钥(secret)使用 Header 里面指定的签名算法(默认是 
HMAC SHA256)生成。流程:

在基于 Token 进行身份验证的的应用程序中,用户登录时,服务器通过Payload、Header和一个密钥(secret)创建令牌 
(Token)并将 Token 发送给客户端,

然后客户端将 Token 保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。你可以把
它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization字段中:
Authorization: 你的Token。

Cookie具有不可跨域名性
就是说,浏览器访问百度不会带上谷歌的cookie

禁用cookie
如果客户端禁用了cookie,通常有两种方法实现session而不依赖cookie。

1.URL重写。就是把sessionId直接附加在URL路径的后面。
2.表单隐藏域。服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把sessionId传回服务器。

比如:

<form name="walking-form" action="/xxx/xxx"> 
    <input type="hidden" name="JSessionId" value="NaOw3vjFW75aKnsF2C2HmdnV9LZcEbzWoWiBdHnLerjQ99zmpQng!-142002807"> 
    <input type="text"> 
</form>

Session共享

对于多网站(同一父域不同子域)单服务器,我们需要解决的就是来自不同网站之间SessionId的共享。由于域名不同
(http://aaa.walking.com 和 http://bbb.walking.com),而SessionId又分别储存在各自的cookie中,因此服务器会认为对
于两个子站的访问,是来自不同的会话。解决的方法是通过修改cookies的域名为父域名达到cookie共享的目的,从而
实现SessionId的共享(非服务器集群session共享)。带来的弊端就是,子站间的cookie信息也同时被共享了。

应用场景

登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookie。
session一个场景是购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要
存储一些信息就用到了session。

怎么操作Session

在Java Web开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的。在传统的java web开
发,我们通过实现 javax.servlet.Servlet 接口或继承 javax.servlet.http.HttpServlet 来实现客户端和服务端以Http协议交
互。

session的过期

客户端与服务端对用户信息的维持有一个时间限制,由于客户端长时间(休眠时间)没有与服务器交互,该session被
认为已过期,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了。

session、cookie总结

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、可以考虑将登录信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

6、在程序开发过程中,我们可以在客户端每次与服务器交互时检查SessionID(Session中属性值,非HttpServlet环境开发中也可以用其它的Key值代替),用于会话管理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值