session 、cookie、token的区别及联系

session

session的中文翻译是“会话”,当用户打开某个web应用时,便与web服务器产生一次session。服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来讲更安全,但是session有一个缺陷:若是web服务器作了负载均衡,那么下一个操做请求到了另外一台服务器的时候session会丢失。web

cookie

cookie是保存在本地终端的数据。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。因为cookie是存在客户端上的,因此浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,因此每一个域的cookie数量是有限的。算法

cookie的组成有:名称(key)、值(value)、有效域(domain)、路径(域的路径,通常设置为全局:"")、失效时间、安全标志(指定后,cookie只有在使用SSL链接时才发送到服务器(https))。下面是一个简单的js使用cookie的例子:后端

用户登陆时产生cookie:api

document.cookie = "id="+result.data['id']+"; path=/";

document.cookie = "name="+result.data['name']+"; path=/";

document.cookie = "avatar="+result.data['avatar']+"; path=/";

使用到cookie时作以下解析:跨域

var cookie = document.cookie;var cookieArr = cookie.split(";");var user_info = {};for(var i = 0; i < cookieArr.length; i++) {

    user_info[cookieArr[i].split("=")[0]] = cookieArr[i].split("=")[1];

}

$('#user_name').text(user_info[' name']);

$('#user_avatar').attr("src", user_info[' avatar']);

$('#user_id').val(user_info[' id']);

token

token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户惟一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成必定长的十六进制字符串,能够防止恶意第三方拼接token请求服务器)。还能够把不变的参数也放进token,避免屡次查库浏览器

cookie 和session的区别

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上。
  2. cookie不是很安全,别人能够分析存放在本地的COOKIE并进行COOKIE欺骗
    考虑到安全应当使用session。
  3. session会在必定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
    考虑到减轻服务器性能方面,应当使用COOKIE。
  4. 单个cookie保存的数据不能超过4K,不少浏览器都限制一个站点最多保存20个cookie。
  5. 因此我的建议:
    将登录信息等重要信息存放为SESSION
    其余信息若是须要保留,能够放在COOKIE中

token 和session 的区别

session 和 oauth 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,用什么就无所谓了。restful

token就是令牌,好比你受权(登陆)一个程序时,他就是个依据,判断你是否已经受权该软件;cookie就是写在客户端的一个txt文件,里面包括你登陆信息之类的,这样你下次在登陆某个网站,就会自动调用cookie自动登陆用户名;session和cookie差很少,只是session是写在服务器端的文件,也须要在客户端写入cookie文件,可是文件里是你的浏览器编号.Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。cookie

cookie机制

Cookies是服务器在本地机器上存储的小段文本并随每个请求发送至同一个服务器。IETF RFC 2965 HTTP State Management Mechanism 是通用cookie规范。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies 。

具体来讲cookie机制采用的是在客户端保持状态的方案。它是在用户端的会话状态的存贮机制,他须要用户打开客户端的cookie支持。cookie的做用就是为了解决HTTP协议无状态的缺陷所做的努力。
正统的cookie分发是经过扩展HTTP协议来实现的,服务器经过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript也能够生成cookie。而cookie的使用是由浏览器按照必定的原则在后台自动发送给服务器的。浏览器检查全部存储的cookie,若是某个cookie所声明的做用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。

cookie的内容主要包括:名字,值,过时时间,路径和域。路径与域一块儿构成cookie的做用范围。若不设置过时时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie通常不存储在硬盘上而是保存在内存里,固然这种行为并非规范规定的。若设置了过时时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过时时间。存储在硬盘上的cookie能够在不一样的浏览器进程间共享,好比两个IE窗口。而对于保存在内存里的cookie,不一样的浏览器有不一样的处理方式。

而session机制采用的是一种在服务器端保持状态的解决方案。同时咱们也看到,因为采用服务器端保持状态的方案在客户端也须要保存一个标识,因此session机制可能须要借助于cookie机制来达到保存标识的目的。而session提供了方便管理全局变量的方式 。

session是针对每个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪一个用户session变量,这个值是经过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。

就安全性来讲:当你访问一个使用session 的站点,同时在本身机子上创建一个cookie,建议在服务器端的session机制更安全些,由于它不会任意读取客户存储的信息。

session机制

session机制是一种服务器端的机制,服务器使用一种相似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序须要为某个客户端的请求建立一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),若是已包含则说明之前已经为此客户端建立过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),若是客户端请求不包含session id,则为此客户端建立一个session而且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

保存这个session id的方式能够采用cookie,这样在交互过程当中浏览器能够自动的按照规则把这个标识发挥给服务器。通常这个cookie的名字都是相似于SEEESIONID。但cookie能够被人为的禁止,则必须有其余机制以便在cookie被禁止时仍然可以把session id传递回服务器。
常常被使用的一种技术叫作URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫作表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时可以把session id传递回服务器。

Cookie与Session都可以进行会话跟踪,可是完成的原理不太同样。普通情况下两者均可以知足需求,但有时分不可以运用Cookie,有时分不可以运用Session。下面通过比拟阐明两者的特性以及适用的场所。

1 .存取方式的不一样

Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。
而Session中可以存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也可以直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。可以把Session看作是一个Java容器类。

2 .隐私策略的不一样

Cookie存储在客户端阅读器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以致修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。
假如选用Cookie,比较好的方法是,敏感的信息如帐号密码等尽可能不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都可以有效的保护。
3.有效期上的不一样

使用过Google的人都晓得,假如登陆过Google,则Google的登陆信息长期有效。用户不用每次访问都从新登陆,Google会持久地记载该用户的登陆信息。要到达这种效果,运用Cookie会是比较好的选择。只须要设置Cookie的过时时间属性为一个很大很大的数字。

因为Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过时时间默许为–1,只需关闭了阅读器该Session就会失效,于是Session不能完成信息永世有效的效果。运用URL地址重写也不能完成。并且假如设置Session的超时时间过长,服务器累计的Session就会越多,越容易招致内存溢出。

4.服务器压力的不一样

Session是保管在服务器端的,每一个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。于是像Google、Baidu、Sina这样并发访问量极高的网站,是不太可能运用Session来追踪客户会话的。

而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。关于Google、Baidu、Sina来讲,Cookie或许是惟一的选择。

5 .浏览器支持的不一样

Cookie是须要客户端浏览器支持的。假如客户端禁用了Cookie,或者不支持Cookie,则会话跟踪会失效。关于WAP上的应用,常规的Cookie就派不上用场了。

假如客户端浏览器不支持Cookie,须要运用Session以及URL地址重写。须要注意的是一切的用到Session程序的URL都要进行URL地址重写,不然Session会话跟踪还会失效。关于WAP应用来讲,Session+URL地址重写或许是它惟一的选择。

假如客户端支持Cookie,则Cookie既可以设为本浏览器窗口以及子窗口内有效(把过时时间设为–1),也可以设为一切阅读器窗口内有效(把过时时间设为某个大于0的整数)。但Session只能在本阅读器窗口以及其子窗口内有效。假如两个浏览器窗口互不相干,它们将运用两个不一样的Session。(IE8下不一样窗口Session相干)

6.跨域支持上的不一样

Cookie支持跨域名访问,例如将domain属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”为后缀的一切域名均可以访问该Cookie。跨域名Cookie现在被广泛用在网络中,例如Google、Baidu、Sina等。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。
仅运用Cookie或者仅运用Session可能完成不了理想的效果。这时应该尝试一下同时运用Cookie与Session。Cookie与Session的搭配运用在实践项目中会完成不少意想不到的效果。

关系的理解
客户第一次发送请求给服务器,此时服务器产生一个惟一的sessionID,并返回给客户端(经过cookie),保存于客户端的内存中,并与一个浏览器窗口对应着,因为HTTP协议的特性,这一次链接就断开了之后此客户端再发送请求给服务器的时候,就会在请求request中携带cookie,因为cookie中有sessionID,因此服务器就知道这是刚才那个客户端。举个简单例子就像人们去超市购物,去存包,第一个去的时候(客户第一次发送请求给服务器),超市会给你一个号码牌(此时服务器产生一个惟一的sessionID,并返回给客户端(经过cookie)),你能够在你本身的柜子里存东西(在服务器属于此客户的内存区域存数据),下次你再去的时候,拿着这个号码牌(请求request中携带cookie),超市就知道哪些东西是你的,而后给你取出来,若是你几天都没去取(session失效了,在服务器端配置),你再去的时候东西就拿不到了若是你把这个号码牌丢了(刚才的cookie失效了,好比你重启电脑,刚才存于内存中sessionID也就丢了),再去拿东西,固然没法定位了,也就拿不到东西了若是是新打开一个浏览器的状况,那就像是又一我的去超市存东西同样,你的东西跟他的东西是两码事,互不影响,他有他本身的sessionID,你有你本身的

相关文章
相关标签/搜索