Cookie
1、 会话(Session)跟踪
Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。Session机制采用的是在服务器端保持状态的方案,而Cookie机制则是在客户端保持状态的方案,Cookie又叫会话跟踪机制。打开一次浏览器到关闭浏览器算是一次会话。
2、 Cookie的工作原理
Web程序是使用HTTP协议传输的, HTTP是一种无状态的协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie可以跟踪会话,弥补HTTP无状态协议的不足。但是注意浏览器可以禁用Cookie,同时服务端也可以不Set-Cookie。
3、 定义
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。如下图:
具体流程如下:
客户端提交一个HTTP请求给服务端;
服务端这个时候做了两件事,一个是Set-Cookie,还有一个是提交响应内容给客户端;
客户端保存Cookie,再次向服务器请求时会在请求头中携带一个Cookie;
服务端提交响应内容给客户端;
举例:分登录之前和登录后,登录前服务端给浏览器一个Cookie,但是这个Cookie里面没有用户信息,但是登录成功之后,服务端给浏览器一个记录了用户信息的Cookie,这个时候的Cookie已经记录了用户的信息,在系统内任意访问,可以实现免登录。
4、 分类
会话Cookie:是指不设置过期时间的Cookie,前面说,浏览器的开启到关闭就是一次会话,当关闭浏览器时,会话Cookie就会跟随浏览器而销毁。当关闭一个页面时,不影响会话Cookie的销毁。会话Cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。
持久Cookie:指设置了过期时间的Cookie。浏览器会把持久Cookie保存到硬盘上,关闭后再次打开浏览器,这些Cookie仍然有效,直到超过设定的过期时间。
5、 Cookie的内容
服务器发送给浏览器的相关内容如下:
Set-Cookie: cookie_user_token=C5CBD6FBD0DA0EE4B5DC36E7075D8CDA;
Expires=Thu, 06-Jul-2017 09:17:46 GMT; domain = 119.29.100.135;Path=/;HttpOnly
1、name:
Cookie的名字cookie_user_token,属性由程序设定,默认值是空引用。Cookie一旦创建,名称便不可更改。
2、value:
Cookie对应的值,属性由程序设定,默认值是空引用。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码。
3、domain:
域名,就是说这个Cookie对应哪一个域名有效。默认值为当前URL的域名部分,不管发出这个Cookie的页面在哪个目录下的。也可以由程序设置此属性为需要的值。
如果我们想让 www.china.com能够访问bbs.china.com设置的Cookie,该怎么办? 我们可以把domain属性设置成“.china.com”,并把path属性设置成“/”。
Cookie具有不可跨域名性。就是说,浏览器访问百度不会带上谷歌的Cookie。
Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。判断依据就是域名。
4、path:
路径,默认值是根目录,即 ”/” ,不管发出这个Cookie的页面在哪个目录下的。也可以由程序设置为一定的路径来进一步限制此Cookie的作用范围。
如果http://www.china.com/test/index.html 建立了一个Cookie,那么在该目录里的所有页面,和该目录下的任何子目录里的页面都可以访问这个Cookie。
路径与域一起构成Cookie的作用范围。
5、expires:
Cookie的过期时间。若设置其值为一个时间,那么当到达此时间后,此Cookie失效。不设置的话默认值是Session,意思是Cookie会和session一起失效。有些页面将Cookie的生存周期设置为“0”或负值,这样在关闭浏览器时,就马上清除Cookie,不会记录用户信息,更加安全。
6、HttpOnly 属性:
这是个关于安全方面的属性,将一个 Cookie 设置为 HttpOnly 后, 通过 Javascript 脚本将无法读取到 Cookie 信息,这能有效地防止黑客用 XSS 发起攻击。一般来说,跟登录相关的 Cookie 必须设置为 HttpOnly。
7、其他属性:
Secure、comment、version可查看下面的链接:
https://www.cnblogs.com/andy-zhou/p/5360107.html
6、 Cookie的缺陷
1、数量受到限制。一个浏览器能创建的 Cookie 数量最多为 300 个,并且每个不能超过 4KB。很多浏览器都限制一个站点最多保存20个Cookie。
2、安全性无法得到保障。通常跨站点脚本攻击往往利用网站漏洞在网站页面中植入脚本代码,或网站页面引用第三方法脚本代码,均存在跨站点脚本攻击的可能,在受到跨站点脚本攻击时,脚本指令将会读取当前站点的所有 Cookie 内容(已不存在 Cookie 作用域限制),然后通过某种方式将 Cookie 内容提交到指定的服务器(如:AJAX)。一旦 Cookie 落入攻击者手中,它将会重现其价值。
3、浏览器可以禁用Cookie,禁用Cookie后,也就无法享有Cookie带来的方便。
Session
1、 相关术语
浏览器会话期间:一个浏览器窗口打开到关闭这个期间;
Session机制:用来在客户端与服务器之间保持状态的解决方案;
Session:把xxx保存在Session里;
HttpSession:把Java里提供的javax.servlet.http.HttpSession;
2、 介绍
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时,服务器只需要从该Session中查找该客户的状态就可以了。
在服务器程序为某个客户端的请求创建Session的同时,会生成一个与该Session相关且唯一的Session id,这个Session id将被在本次响应中返回给客户端保存。
在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器的Session中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。
3、 Session的创建:
当程序需要为某个客户端的请求创建一个Session时,服务器首先检查这个客户端的请求里是否已包含了Session Id,如果已包含则说明以前已经为此客户端创建过Session,服务器就按照Session Id把这个Session检索出来使用(检索不到,会新建一个)。
如果客户端请求不包含Session Id,则为此客户端创建一个Session并且生成一个与此Session相关联的Session Id,Session Id的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个Session Id将被在本次响应中返回给客户端保存。
4、 Session Id的保存
可以采用Cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个Cookie的名字都是类似于SEEESIONID。
由于Cookie可以被人为的禁止,必须有其他机制以便在Cookie被禁止时仍然能够把Session id传递回服务器。
一种技术叫做URL重写,就是把Session id直接附加在URL路径的后面。附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid=ByOK3vj!-145788764;另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vj!-145788764。
这两种附加方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式有利于把session id的信息和正常程序参数区分开来。为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个Session id。
另一种技术叫表单隐藏字段。详情查看下面链接:
https://www.cnblogs.com/lonelydreamer/p/6169469.html
5、 Session的有效期
大部分Session机制都使用会话Cookie来保存Session id,保存到硬盘上的Cookie不会由于关闭浏览器导致Session被删除。服务器为Session设置了一个失效时间,当距离客户端上一次使用Session的时间超过这个失效时间时,服务器就可以认为用户已经停止了活动,才会把Session删除以节省存储空间防止内存溢出。
Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。
6、 Session共享:
对于多网站(同一父域不同子域)单服务器,我们需要解决的就是来自不同网站之间SessionId的共享。
由于域名不同(aaa.test.com和bbb.test.com),而SessionId又分别储存在各自的Cookie中,因此服务器会认为对于两个子站的访问,是来自不同的会话。
解决的方法是通过修改Cookie的域名为父域名达到Cookie共享的目的,从而实现SessionId的共享。
带来的弊端就是,子站间的Cookie信息也同时被共享了。
7、 为什么要使用Session?
因为很多第三方可以获取到这个Cookie,服务器无法判断Cookie是不是真实用户发送的,所以Cookie可以伪造,伪造Cookie实现登录进行一些HTTP请求。如果从安全性上来讲,Session比Cookie安全性稍微高一些。
8、 Session有哪些缺陷?
因为Session是存储在服务器当中的,所以Session过多,会对服务器产生压力。Session的生命周期算是减少服务器压力的一种方式。
token
1、 定义:
token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。
当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。
2、 token的组成;
uid: 用户唯一身份标识
time: 当前时间的时间戳
sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接。
固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库。
3、 token认证流程:
客户端使用用户名和密码请求登录。
服务端收到请求,验证用户名和密码。
验证成功后,服务端会生成一个token,然后把这个token发送给客户端。
客户端收到token后把它存储起来,可以放在cookie、sessionStorage或者Local Storage(本地存储)里。
客户端每次向服务端发送请求的时候,将token放入headers中。
服务端收到请求,然后去验证客户端请求里面带着token,如果验证成功,就向客户端返回请求的数据。
token 的认证流程与cookie很相似。使用token机制的身份验证方法,在服务器端不需要存储用户的登录记录。
4、 token的加密:
token是很容易泄露的,如果不进行加密处理,很容易被恶意拷贝并用来登录。
待加密字符串的组成可能包含Request Header 或 Body 中的一个或多个参数,或者是多次加密。具体的规则要同开发获取。如:待加密字符串:request headers中的user-agent + 请求方法 + 请求发送时间 + saltBase64。
其他内容可参考:https://www.cnblogs.com/xuxinstyle/p/9675541.html
Cookie和Session的使用选择:
a、Cookie数据存放在客户的浏览器上,Session数据放在服务器上
b、Cookie不是很安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗,考虑到安全应当使用Session。
c、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面应当使用Cookie。
d、单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie。
e、可以将登陆信息等重要信息存放为Session;其他信息需要保存,可以放在Cookie。
Cookie与Session的区别:
1.存储位置不同
Cookie的数据信息存放在客户端浏览器上。Session的数据信息存放在服务器上。
2.存储容量不同
通常情况,单个Cookie保存的数据≤4KB,一个站点最多保存20个Cookie。对于Session并没有上限,但出于对服务器端的性能考虑,不要存放过多的Session,并设置Session删除机制。
3.存取方式不同:
Cookie中只能保管ASCll字符串,需要通过编码的方式存取Unicode字符或者二进制数据。运用Cookie难以实现存储略微复杂的信息。
4.隐私策略不同
Cookie对客服端是可见的,别有用心的人可以分析放在本地的Cookie并进行Cookie欺骗,所以它是不安全的。Session存储在服务器上,不存在敏感信息泄露的风险。
5.有效期不同
开发可以通过设置Cookie的属性,达到Cookie长期有效的效果。由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该Session就会失效,因而Session不能达到长期有效的效果,就算不依赖Cookie,运用URL地址重写也不能完成,因为假如设置Session的超过时间过长,服务器累计的Session就会越多,越容易导致内存溢出。
6.服务器压力不同
Session是保管在服务端的,每个用户都会产生一个Session,假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。Cookie是保管在客户端,不占用服务器资源,对于并发用户十分多的网站,Cookie是很好的选择。
7.浏览器支持不同:
假如客户端浏览器不支持Cookie。
Cookie是需要客户端浏览器支持的。假如客户端禁用了Cookie,或者不支持Cookie,则会话跟踪会失效。关于WAP上的应用,常规的Cookie就派不上用场了。
运用Session需要使用URL地址重写的方式。一切用到Session程序的URL都要进行URL地址重写,否则Session会话跟踪还会失效。关于WAP应用来说,Session+URL地址重写或许是它唯一的选择。
假如客户端支持Cookie。
Cookie 既能够设为本浏览器窗口以及子窗口内有效(把过期时间设为−1),也能够设为一切窗口内有效(把过期时间设为某个大于0的整数)。
Session 只能在本窗口以及其子窗口内有效。假如两个浏览器窗口互不相干,它们将运用两个不同的Session。(IE8下不同窗口Session相干。)
8.跨域支持上的不同
Cookie 支持跨域名访问,例如,将 domain 属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中,例如,Google、Baidu、Sina等。
Session则不会支持跨域名访问。Session仅在它所在的域名内有效。
Cookie总结:
1. Cookie数据存放在客户的浏览器上;
2.Cookie对客服端是可见的,别有用心的人可以分析放在本地的Cookie并进行Cookie欺骗,所以它是不安全的;
3.通常情况,单个Cookie保存的数据≤4KB,一个站点最多保存20个Cookie;
4.Cookie中只能保管ASCll字符串,需要通过编码的方式存取Unicode字符或者二进制数据。运用Cookie难以实现存储略微复杂的信息;
5.开发可以通过设置Cookie的属性,达到Cookie长期有效的效果;Cookie是保管在客户端,不占用服务器资源,对于并发用户十分多的网站,Cookie是很好的选择;
6. 假如客户端浏览器不支持Cookie。Cookie是需要客户端浏览器支持的。假如客户端禁用了Cookie,或者不支持Cookie,则会话跟踪会失效。关于WAP上的应用,常规的Cookie就派不上用场了。运用Session需要使用URL地址重写的方式。一切用到Session程序的URL都要进行URL地址重写,否则Session会话跟踪还会失效。关于WAP应用来说,Session+URL地址重写或许是它唯一的选择。
假如客户端支持Cookie。Cookie 既能够设为本浏览器窗口以及子窗口内有效(把过期时间设为−1),也能够设为一切窗口内有效(把过期时间设为某个大于0的整数)。
Session 只能在本窗口以及其子窗口内有效。假如两个浏览器窗口互不相干,它们将运用两个不同的Session。(IE8下不同窗口Session相干。)
7. Cookie 支持跨域名访问,例如,将 domain 属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中,例如,Google、Baidu、Sina等。
session总结:
1.session数据放在服务器上,不存在敏感信息泄露的风险;
2.对于Session会在一定时间内保存在服务器上,并且保存的数据没有上限,但出于对服务器端的性能考虑,不要存放过多的Session,并设置Session删除机制;
3.由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该Session就会失效,因而Session不能达到长期有效的效果,就算不依赖Cookie,运用URL地址重写也不能完成,因为假如设置Session的超过时间过长,服务器累计的Session就会越多,越容易导致内存溢出;
4.Session是保管在服务端的,每个用户都会产生一个Session,假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存;可以将登陆信息等重要信息存放为Session;其他信息需要保存,可以放在Cookie。
5. Session不会支持跨域名访问。Session仅在它所在的域名内有效。