Cookie,Session与Token解析

前言

在进行用户的授权认证时主要可以有三种方式,分别是Cookie,Session与Token,本文将对它们进行简要的介绍并总结他们三者之间的区别。

Cookie

首先,什么是Cookie?
简而言之,Cookie就是是一些数据,类型为“小型文本文件”,会以key-value的形式存储于电脑上的文本文件中。主要用于存储服务器返回给客服端的信息,然后在客户端中进行保存。在下一次访问该网站时,客户端会将保存的Cookie一同发给服务器,服务器再利用Cookie进行一些操作,比如使用Cookie记录用户的登录状态信息。

Cookie具有以下特性:

  • cookie是不可跨域名的,因此具有局限性。
  • cookie会被附加在每个HTTP请求中,因此增加了流量。
  • 由于在HTTP请求中的cookie是明文传递的,所以安全性成问题,但如果用HTTPS就可以。
  • Cookie的大小限制在4KB左右,因此不能储存复杂大量的数据。

Session

什么是Session?

Session就是会话,Session会为每一次会话分配一个Session对象,它是由服务器创建,并且存储在服务器中,会存下用户的对应信息作为一个身份标记,这样做是为了让服务器知道某个请求是谁发送过来的。因此Session一般就是用来对用户的信息进行存储。而客户端也会存储这个身份标记,默认会用cookie来存储。

并且session可传递任何数据,比如像基本数据类型、对象、集合、数组等等。上面说过cookie存储于电脑上的文本文件,而session在是存储在内存中的。

但是session也具有很多的缺点:

  • 每个用户在登录之后就会记录下一个session并把会话的所有信息储存在内存之中,这样就会时服务器的压力较大。并且session在分布式中是非常不方便的,因为分布式通常是几个服务之间的调用,而session把认证信息储存在一个服务器中,所以就限制了分布式负载均衡的能力。
  • session的信息是不安全的,如果被截获,就可能会受到跨站脚本攻击(XSS)和跨站请求伪造攻击(CSRF)。
  • 在跨域使用不方便,因为session默认只会在一个域名下,因此在后端多节点场景中会很受限制。

Token

什么是Token?

token可以被称之为令牌,它是服务端生成的一串字符串,以作客户端进行请求的一个令牌。比如当在用户进行第一次登录后,服务器就会生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,就不需再携带更多的数据来进行身份验证。这样可以减轻服务器的压力,减少频繁的查询数据库,提升性能。

如何生成token?

生成token可以使用多种方法,生成的原则就是要对信息进行加密,不能泄露。

第一种方法就是使用JWT:JWT是一种开放的标准,用于在网络应用程序之间安全地传输信息。它可以使用HS256、HS384、HS512等算法生成安全的token。它的优点是易于实现和使用。

关于其详细介绍可以看我的另一篇博客:JWT详解

还可以使用OAuth2:OAuth2是一种标准的授权协议,通常用于API授权。它可以用于生成token来访问受保护的资源。OAuth2的优点是安全性高,支持多种授权方式。

而token就具有很多优点:

首先它是无状态可扩展的,在客户端存储的Tokens是无状态的且数据量小,传输的就会很快,不会给服务器很大的压力。并且能够被扩展,能够创建与其它程序共享权限的程序。基于这种无状态和不存储Session信息,负载负载均衡器能够将用户信息从一个服务传到其他服务器上。

其次它是安全的,在请求中发送token,而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。

并且其可以实现多平台跨域,不在局限于一个平台。

区别

最后总结以下三者的区别

cookie与session的区别

  • cookie的数据信息存放在客户端浏览器上,session的数据信息存放在服务器上。
  • 单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。对于session来说并没有上限,但出于对服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制。
  • cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据,session中能够存储任何类型的数据。
  • cookie对客户端是可见的,所以它是不安全的。session存储在服务器上,对客户端是透明的,不存在敏感信息泄漏的风险,是比较安全的。
  • 通过设置cookie的属性,达到使cookie长期有效的效果。session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session不能达到长期有效的效果。
  • cookie支持跨域名访问,session不支持跨域名访问。

Session和Token的区别

  • token中的数据是加密的,更加的安全,而session中没有加密。
  • token支持跨域名访问,session不支持跨域名访问。
  • Session是存储在服务器内存中,这就意味着如果网站或者应用很大的情况下会耗费大量的资源。由于token是无状态的,在许多情况下,它们可以节省服务器资源。因此token要比 Session具有更强的可扩展性。
  • Session是存放在服务器端的,oken是放在客户端存储的。

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值