因为HTTP是一种无状态的协议,服务器单从网络链接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,不管谁访问都必须携带本身通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工做原理。git
Cookie其实是一小段的文本信息。客户端请求服务器,若是服务器须要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还能够根据须要修改Cookie的内容。以下图:github
属性项 | 属性项介绍 |
---|---|
Name | 一个惟一肯定cookie的名称(cookie名称不区分大小写,实践中最好区分,由于一些服务器会区分),URL编码 |
Value | 存储cookie的字符串值,值必须通过URL编码 |
Expires | 过时时间,在这个时间点后Cookie失效 |
Domain | 生成Cookie域名 |
Path | 该Cookie是在当前那个路径下生成的 |
Secure | 加密设置,设置他以后,只会在SSL链接时才会回传该Cookie |
这里我只要说二个点:
一、Expires:该Cookie失效的时间,单位秒。面试
二、Domain:
咱们如今有二个域名。域名A:b.f.com,域名B:d.f.com;显然域名A和域名B都是f.com的子域名算法
若是域名A没有显式设置Cookie的domain方法,那么domain就为.b.f.com,不同的是,这时,域名A的子域名将没法获取这个Cookie数据库
HttpOnly: 这个属性是面试的时候常考的,若是这个属性设置为true,就不能经过js脚原本获取cookie的值,能有效的防止xss攻击
因为js没有给原生的操做方法,咱们能够简单地封装一下:跨域
var cookieUtil = { getItem: function (name) { var cookieName = encodeURIComponent(name) + "=", cookieStart = document.cookie.indexOf(cookieName), cookieValue = null; if (cookieStart > -1) { var cookieEnd = document.cookie.indexOf(';', cookieStart); if (cookieEnd == 1) { cookieEnd = document.cookie.length; } cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd)) } return cookieValue; }, setItem: function (name, value, expires, path, domain, secure) { var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value); if (expires) { cookieText += ";expires=" + expires.toGMTString(); } if (path) { cookieText += ";path=" + path; } if (domain) { cookieText += ";domain=" + domain; } if (secure) { cookieText += ";secure"; } document.cookie = cookieText; }, unset: function (name, path, domain, secure) { this.setItem(name, "", new Date(0), path, domain, secure) } } CookieUtil.setItem("name", 'tom'); // 设置cookie console.log(CookieUtil.getItem('name'));//读取cookie CookieUtil.unset("name")//删除cookie
由于Cookie是存储在客户端,用户能够随意修改。因此,存在必定的安全隐患。浏览器
防篡改签名:服务器为每一个Cookie项生成签名。若是用户篡改Cookie,则与签名没法对应上。以此,来判断数据是否被篡改。
原理以下:安全
举个栗子:
好比服务器接收到请求中的Cookie项username=pony|34Yult8i,而后使用签名生成算法secret(pony)=666。 算法获得的签名666和请求中数据的签名不一致,则证实数据被篡改。服务器
Session: 是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据能够保存在集群、数据库、文件中.为了得到更高的存取速度,服务器通常把Session放在内存里。每一个用户都会有一个独立的Session。若是Session内容过于复杂,当大量客户访问服务器时可能会致使内存溢出。所以,Session里的信息应该尽可能精简。cookie
当客户端请求建立一个session的时候,服务器会先检查这个客户端的请求里是否已包含了一个session标识 - sessionId,
sessionId的值通常是一个既不会重复,又不容易被仿造的字符串,这个sessionId将被在本次响应中返回给客户端保存。保存sessionId的方式大多状况下用的是cookie。
session 的运行依赖 session id,而 session id 是存在 cookie中的
若是客户端的浏览器禁用了 Cookie怎么办?通常这种状况下,会使用一种叫作URL重写的技术来进行会话跟踪,(在 url 中传递 session_id)即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
cookie | session | |
---|---|---|
存储位置 | 客户端 | 服务器端 |
存取方式 | 只能保管ASCII字符串 | 够存取任何类型的数据 |
有效期不一样 | Cookie能够设置过时时间属性 | JSESSIONID的过时时间默许为–1,只需关闭了阅读器该Session就会失效 |
服务器压力 | Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择 | Session是保管在服务器端的,每一个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存 |
跨域支持上的不一样 | Cookie支持跨域名访问,例如将domain属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”为后缀的一切域名均可以访问该Cookie。 | Session则不会支持跨域名访问。Session仅在他所在的域名内有效。 |
区分路径 | cookie中若是设置了路径参数,那么同一个网站中不一样路径下的cookie互相是访问不到的 | session不能区分路径,同一个用户在访问一个网站期间,全部的session在任何一个地方均可以访问到 |
若是有错误或者不严谨的地方,请务必给予指正,十分感谢。若是喜欢或者有所启发,欢迎 star对做者也是一种鼓励。