Session/Cookie/Token的区别

 

一、cookie

cookie是Web服务器用来识别Web用户的小块数据。Cookie是保存在客户端的一组数据,主要用来保存用户名等个人信息。
cookie由服务器生成,发送给浏览器,该数据以一个称为 “Set-Cookie”  HTTP  报头格式从  Web  服务器发出。   浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时以称为 “Cookie”  HTTP  报头格式将  cookie  发送回服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。
     cookie 的组成有:名称(key)、值(value)、有效域(domain)、路径(域的路径,一般设置为全局:"\")、失效时间、安全标志(指定后,cookie只有在使用SSL连接时才发送到服务器(https))。基于以上属性,浏览器只会向服务器发送该服务器产生的那些cookie。
 


二、session

由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识别具体的用户,这个机制就是Session。典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识SessionID。在服务端保存Session的方法很多,内存、数据库、文件都有,目前是存放在服务器的内存中。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。
服务端通过在Cookie中记录SessionID(每建立一次会话,SessionID随机生成)发送给客户端,客户端请求时将SessionID发送回服务器,服务器以SessionID识别具体的用户。Session机制一般通过Cookie实现。
session的中文翻译是 会话 ,当用户打开某个web应用时,便与web服务器产生一次session。服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。


三、 基于token的身份验证方法

  1. 验证流程如下:
  1. 客户端使用用户名和密码请求登录;
  2. 服务端收到请求后,验证用户名与密码;
  3. 验证成功后,服务端会签发一个token,发送给客户端;
  4. 客户端收到token后存储起来,比如放在cookie里或localstorage里;
  5. 客户端每次向服务端请求资源时,带着服务前签发的token;
  6. 服务端收到请求后,去验证客户端请求里带着的token,若验证成功,返回客户端返回请求的数据;
  1. JWT
实施token验证的标准方法之一,表示:Json Web Token。JWT标准的token有3部分:
  • Header
  • Payload
  • Signature
中间用 “.” 分隔,并且会用Base64编码,所以真正的token看起像是这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 .eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
  1. Header
Header部分包含:token类型,使用的算法,比如下面的就是JWT,使用算法是HS256:
{
  "typ" : "JWT" ,
  "alg" : "HS256"
}
上面的内容要用Base64编码一下,变成这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
  1. Payload
Payload里面是token具体的内容,这些内容有些是标准字段,你也可以添加其他需要的内容。以下是标准字段:
  • iss:issuer,发行者
  • sub:Subject,主题
  • aud:audience,观众
  • exp:expiration time,过期时间
  • nbf:not before
  • iat:issued at,发行时间
  • jti:JWT ID
比如,下面这个payload,用到了iss发行者和exp过期时间。另外还有两个自定义是字段:name、admin。
{
  "iss" : " ninghao.net " ,
  "exp" : "1438955445" ,
  "name" : "wanghao" ,
  "admin" : true
}
使用Base64编码后变成这样:
eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ
  1. Signature
Signature有三部分内容:header(Base64编码过)、payload(Base64编码过),secret(相当于一个密码,这个密码秘密地存储在服务端)。
过程:
  1. 将上述Base64编码过的header和payload加在一起—>header.payload;
  2. 将secret加入header.payload中,一同进行哈希加密;
var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
HMACSHA256(encodedString, 'secret' );
处理完后是这样:
        SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
最后,这个服务端生成并发送给客户端的token是这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 .eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

四、cookie session的区别

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
   考虑到安全应当使用session。
3、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
4、session的确是存放在服务器的内存中(但不是4k上限,具体大小限制应该是服务器内存),而且同一个sessionid的多个 http请求会排队,也就是session对于同一个浏览器来说是同步的,用不好会极大影响性能。另外,session依赖于客户端cookie,因为 sessionid是存放在客户端浏览器进程cookie中的,因此不支持cookie的浏览器,session也会丢失(一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即:每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户)    。 考虑到减轻服务器性能方面,应当使用COOKIE。
5、所以个人建议:
   将登陆信息等重要信息存放为 SESSION
   其他信息如果需要保留,可以放在COOKIE中

五、token session 的区别

    session    token并不矛盾,作为身份认证   token安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态
    App 通常用restful api跟server打交道。Rest是stateless的,也就是app不需要像browser那样用cookie来保存session,因此用session token来标示自己就够了,session/state由api server的逻辑处理。   如果你的后端不是stateless的 rest api,  那么你可能需要在app里保存session.可以在app里嵌入webkit,用一个隐藏的browser来管理cookie session.
 
   Session  是一种HTTP存储机制,目的是为无状态的HTTP提供的持久机制。所谓 Session  认证只是简单的把 User  信息存储到 Session  里,因为 SID  的不可预测性,暂且认为是安全的。这是一种认证手段。   Token  ,如果指的是OAuth Token  或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对 App  。其目的是让 某App有权利访问 某用户 的信息。这里的   Token是唯一的。不可以转移到其它   App上,也不可以转到其它 用户 上。   转过来说 Session  。Session只提供一种简单的认证,即有此   SID,即认为有此   User的全部权利。是需要严格保密的,这个数据应该只保存在站方,不应该共享给其它网站或者第三方App。   所以简单来说,如果你的用户数据可能需要和第三方共享,或者允许第三方调用  API  接口,用  Token  。如果永远只是自己的网站,自己的   App,用什么就无所谓了。
  token 就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用cookie自动登录用户名;session和cookie差不多,只是session是写在服务器端的文件,也需要在客户端写入cookie文件,但是文件里是你的浏览器编号.Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。

你可能感兴趣的:(网络)