session、cookie、token的区别及联系
session
session的中⽂翻译是“会话”,当⽤户打开某个web应⽤时,便与web服务器产⽣⼀次session。服务器使⽤session把⽤户的信息临时保存在了服务器上,⽤户离开⽹站后session会被销毁。这种⽤户信息存储⽅式相对cookie来说更安全,可是session有⼀个缺陷:如果web服务器做了负载均衡,那么下⼀个操作请求到了另⼀台服务器的时候session会丢失。
cookie
cookie是保存在本地终端的数据。cookie由服务器⽣成,发送给浏览器,浏览器把cookie以kv形式保存到某个⽬录下的⽂本⽂件内,下⼀次请求同⼀⽹站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加⼊了⼀些限制确保cookie不会被恶意使⽤,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。
cookie的组成有:名称(key)、值(value)、有效域(domain)、路径(域的路径,⼀般设置为全局:"\")、失效时间、安全标志(指定后,cookie 只有在使⽤SSL连接时才发送到服务器(https))。下⾯是⼀个简单的js使⽤cookie的例⼦:
⽤户登录时产⽣cookie:
使⽤到cookie时做如下解析:
var cookie = kie;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,⽤什么就⽆所谓了。
token就是令牌,⽐如你授权(登录)⼀个程序时,他就是个依据,判断你是否已经授权该软件;cookie就是写在客户端的⼀个txt⽂件,⾥⾯包括你登录信息之类的,这样你下次在登录某个⽹站,就会⾃动调⽤cookie⾃动登录⽤户名;session和cookie差不多,只是session是写在服务器端的⽂件,也需要在客户端写⼊cookie⽂件,但是⽂件⾥是你的浏览器编号.Session的状态是存储在服务器端,客户端只有session id;⽽Token的状态是存储在客户端。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
本⽂分别对Cookie与Session做⼀个介绍和总结,并分别对两个知识点进⾏对⽐分析,让⼤家对Cookie和Session有⼀个更深⼊的了解,并对⾃⼰的开发⼯作中灵活运⽤带来启⽰。
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标识(称为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”,则以“.biaodianfu”为后缀的⼀切域名均能够访问该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,
你有你⾃⼰的
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论