cookie、session与token详解

一、token

令牌,是用户身份的验证方式。

最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名)

对Token认证的五点认识:

  • 一个Token就是一些信息的集合;
  • 在Token中包含足够多的信息,以便在后续请求中减少查询数据库的几率;
  • 服务端需要对【cookie】和【HTTP Authrorization Header】进行Token信息的检查;
  • 基于上一点,你可以用一套token认证代码来面对浏览器类客户端和非浏览器类客户端;
  • 因为token是被签名的,所以我们可以认为一个可以解码认证通过的token是由我们系统发放的,其中带的信息是合法有效的;

二、session

会话,代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续。

cookie中存放着一个sessionID,请求时会发送这个ID;

session因为请求(request对象)而产生;

session是一个容器,可以存放会话过程中的任何对象;

session的创建与使用总是在【服务端】,浏览器从来都没有得到过session对象;

session是一种http存储机制,目的是为武装的http提供持久机制。

三、cookie

储存在用户本地终端上的数据,服务器生成,发送给浏览器,下次请求统一网站给服务器。

cookie与session的区别

cookie数据存放在客户端上,session数据放在服务器上;

cookie不是很安全,且保存数据有限;

session一定时间内保存在服务器上,当访问增多,占用服务器性能。

session与token的区别

作为身份认证,token安全性比session好;

Session 认证只是简单的把User 信息存储到Session 里,因为SID 的不可预测性,暂且认为是安全的。这是一种【认证】手段。 而Token ,如果指的是OAuth Token 或类似的机制的话,提供的是【认证、授权】 ,认证是针对用户,授权是针对App 。其目的是让某App有权利访问某用户的信息。

token与cookie

  • token和cookie一样都是首次登陆时,由服务器下发,都是当交互时进行验证的功能,作用都是为【无状态的HTTP】提供的持久机制。
  • token存在哪儿都行,localstorage或者cookie。
  • token和cookie举例,token就是说你告诉我你是谁就可以。
cookie 举例:服务员看你的身份证,给你一个编号,以后,进行任何操作,都出示编号后服务员去看查你是谁。
token  举例:直接给服务员看自己身份证
  • token优势在于,token由于服务器端不存储会话,所以可扩展性强,token还可用于APP中。
  • 对于token而言,服务器不需要去查看你是谁,不需要保存你的会话。当用户logout的时候cookie和服务器的session都会注销;但是当logout时候token只是注销浏览器信息,不查库。
  • Cookie是不允许垮域访问的,但是token是支持的, 前提是传输的用户认证信息通过HTTP头传输;
  • token就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;
  • cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用cookie自动登录用户名

总结:

Token 完全由应用管理,所以它可以避开同源策略

Token 可以避免 CSRF 攻击

Token 可以是无状态的,可以在多个服务间共享

四、HTTP协议与状态保持

Http是一个无状态协议。

1、实现状态保持的方案:

  • 修改Http协议,使得它支持状态保持(难做到)

  • Cookies:通过客户端来保持状态信息

    Cookie是服务器发给客户端的特殊信息,cookie是以文本的方式保存在客户端,每次请求时都带上它。

  • Session:通过服务器端来保持状态信息

    Session是服务器和客户端之间的一系列的交互动作,服务器为每个客户端开辟内存空间,从而保持状态信息,由于需要客户端
    也要持有一个标识(id),因此,也要求服务器端和客户端传输该标识,标识(id)可以借助Cookie机制或者其他的途径来保存。

2、COOKIE机制

Cookie的基本特点

Cookie保存在客户端,只能保存字符串对象,不能保存对象类型

需要客户端浏览器的支持:客户端可以不支持,浏览器用户可能会禁用Cookie。

采用Cookie需要解决的问题

Cookie的创建,通常是在服务器端创建的(当然也可以通过javascript来创建)服务器通过在http的【响应头】加上特殊的指示,那么浏览器在读取这个指示后就会生成相应的cookie了。

Cookie存放的内容,业务信息(“key”,“value”),过期时间,域和路径。

浏览器是如何通过Cookie和服务器通信?

通过请求与响应,cookie在服务器和客户端之间传递。

每次请求和响应都把cookie信息加载到【响应头】中,依靠cookie的key传递。

3、SESSION机制

每次客户端发送请求,服务断都检查是否含有sessionId。

如果有,则根据sessionId检索出session并处理;如果没有,则创建一个session,并绑定一个不重复的sessionId。

基本特点

状态信息保存在服务器端,这意味着安全性更高。通过类似与Hashtable的数据结构来保存,能支持任何类型的对象(session中可含有多个对象)

保存会话id的技术

Cookie

这是默认的方式,在客户端与服务器端传递JSeesionId

缺点:客户端可能禁用Cookie

五、JWT【JSON Web Tokens】

1、跨域认证的问题

这种模式的问题在于,扩展性(scaling)不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。

举例来说,A 网站和 B 网站是同一家公司的关联服务。现在要求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录,请问怎么实现?

一种解决方案是 session 数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败。

另一种方案是服务器索性不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器。JWT 就是这种方案的一个代表。

2、JWT原理

JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。

{
  "姓名": "张三",
  "角色": "管理员",
  "到期时间": "2018年7月1日0点0分"
}

以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。

服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

3、JWT数据结构

JWT 的三个部分依次如下:

  • Header(头部)
  • Payload(负载)
  • Signature(签名)

4、JWT 的使用方式

客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。

此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。

 Authorization: Bearer <token>

另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。

4、JWT 的几个特点

  • JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
  • JWT 不加密的情况下,不能将秘密数据写入 JWT。
  • JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
  • JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
  • JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
  • 为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

5、BloceFace

将token放在cookie里面

  • 如果cookie被清除,token也将被清除。
  • 不能够跨域
  • 不能多服务共享
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值