Cookie的简单理解

Web应用程序是使用HTTP协议传输数据的。而HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话,无法辨别这个请求是哪一个用户发出的,这样的话就会造成数据混乱,用户的数据没有安全的保障,整个程序处于混乱的状态,这显然是不行的——于是会话跟踪技术应运而生,弥补了HTTP协议的不足之处。

会话跟踪是web程序中最常用的技术,通过跟踪用户的整个会话,来辨别是否是同一用户,用于确认用户的身份,保证用户所有的请求操作都属于同一个会话,保证了用户信息的安全私密性,也使得程序井然有序,常用的会话跟踪技术有两种Cookie和Session,这里我们讲Cookie

一.什么是Cookie?

首先Cookie是通过在客户端记录信息确定用户身份,Cookies是服务器在客户端上存储的小段文本并随每一个请求发送至同一个服务器,客户端请求服务器,服务器使用response向客户端浏览器发送Cookies,在客户终端,浏览器解析这些Cookies并将它们保存在客户端的本地,当客户端再次请求该服务器,它会自动将请求和Cookies一同发送给该服务器,服务器解析Cookies,以此来辨别是哪个用户,用户当前状态,然后再把修改后的Cookies再次发送到客户端保存下来。

二.Cookie的工作原理是什么?

Cookies的工作原理是:由于服务器从连接上不能辨别用户,所以引入的Cookie,而Cookie就好像一个用户独有的身份令牌,当客户端进行第一次请求,服务器就会生成一个"身份令牌"给这个客户端,当客户端再次请求(请求+“身份令牌”),服务器从“身份令牌”上辨认出,这就是xx用户的请求,这样的话我们就可以辨别每个请求对应的用户身份,不会造成数据混乱。(Cookie的工作原理与基于 Token 的身份验证方法有些相同)

三.Cookie的属性

从客户端读取Cookie时,包括maxAge(有效时间)在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期。

四.Cookie的不可跨域名性

我们每天使用的网站那么多,那么他们的Cookie会不会共用呢?会不会造成混乱呢?这当然不会,开发人员早就想到这一点(Cookie有隐私安全机制来规避这种Cookie混乱),每个人域名只能使用管理携带自己本域名的Cookies(比如我们同时进行再京东购物和天猫购物,我们请求京东服务器会携带京东域名的Cookies,不会携带天猫域名下的Cookies,反之亦然),保证用户隐私安全和程序正确性

说到这里有人就开始疑问了(比如zhidao.baidu.com和wenku.baidu.com,它们是两个二级域名,它们为什么能够公用Cookies?),正常情况下它们也是不能公用Cookies的,但是我们的伟大的开发人员也早就料到这一点,让我们可以设置同一个一级域名下的二级域名可以公用Cookies,这就需要用到Cookie的domain属性了

Cookie cookie = new Cookie("time","20180324");// 新建Cookie
cookie.setDomain(".baidu.com");/ 设置域名
cookie.setPath("/");// 设置路径
cookie.setMaxAge(Integer.MAX_VALUE);// 设置有效期

response.addCookie(cookie);// 输出到客户端

设置二级域名共用Cookies的规则如下:一个Cookie要是在多个二级域名中共享,需要设置domain为顶级域名,这样就可以在所有二级域名里面对这个Cookie进行操作,但二级域名自己的Cookies还是不能够共享的,不能读取其他二级域名的Cookie,顶级域名只能对domain设置为顶级域名的Cookie进行操作,domain设置为其他子级域名则无法获取和操作。

五.Cookie的路径

在开发中我们服务器生成许多Cookie,但是有时候我们只想让某个路径下的程序使用某一个特定的Cookie,其他的路径都无法访问到(比如登录页面,我们只想要让登录页面使用这个用于登录的Cookie),我们应该怎么做呢?,这就需要用到Cookie里面的path属性,来指定访问路径:比如只允许“xxxx/login/”路径下的页面使用这个Cookie,我们需要这样设置:

Cookie cookie = new Cookie("time","20180324");// 新建Cookie
cookie.setPath("/login/"); // 设置访问路径
response.addCookie(cookie); // 输出到客户端 

这样我们这个Cookie只能由“xxxx/login/”下的页面访问,对其进行操作

六.Cookie的安全性

众所众知HTTP 协议无法加密数据,所有通信数据都在网络中明文“裸奔”,这就容易导致数据泄露、数据篡改等安全问题。Cookie在HTTP等非安全协议中传输,这显然是及其不安全的,而HTTPS 是用来解决 HTTP 明文协议的缺陷,在 HTTP 的基础上加入 SSL/TLS 协议,依靠 SSL 证书来验证服务器的身份,为客户端和服务器端之间建立“SSL”通道,确保数据运输安全。所以我们可以设置Cookie在HTTPS协议中传输,我们需要这样做:
Cookie cookie = new Cookie("time", "20180324"); // 新建Cookie
cookie.setSecure(true); // 设置安全属性为true,这样Cookie传输就使用HTTPS协议传输
response.addCookie(cookie);  // 输出到客户端

但是这样保证了Cookie传输过程中的安全性,但是怎么防止XSS攻击呢?(一般指通过js等脚本程序),防止他们通过脚本获取Cookie呢?所以我们有新增了一个属性HttpOnly,我们需要这样做:

Cookie cookie = new Cookie("time", "20180324"); // 新建Cookie
cookie .setHttpOnly(true); // 设置属性为true,这样Cookie就能有效防止XSS攻击
response.addCookie(cookie);  // 输出到客户端

七.Cookie的有效时间

Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。我们需要这样做:

Cookie cookie = new Cookie("username","maliming");   // 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE);// 设置生命周期为MAX_VALUE,设该Cookie为永久
response.addCookie(cookie);  // 输出到客户端

maxAge属性值有三种:正数,零,负数

(1)正数:表示该Cookie会在你maxAge秒之后自动失效,客户端检测到这个Cookie的有效时间为正数,就会将该Cookie持久化,写入到与之对应的Cookie文件之中,写入后它不在乎客户端的关闭与否,只要在该Cookie的有效时间段内,就会存在,登录与之对应的网站依然有效,反之就销毁,失效。

(2)零:因为Cookie没有删除的方法,设置有效时间为零,则就用立即失效表示删除该Cookie,然后客户端会把该失效的Cookie从内存或Cookie文件中删除

(3)负数:表示该Cookie不会被持久化,之暂时保存在客户端的内存中,关闭客户端就丢失(失效),Cookie默认的maxAge值为–1。有效作用仅在该客户端打开的的窗口,关闭就丢失

八.Cookie的修改,删除

Cookie并没有提供修改删除的方法,但是我们可以用其他的方法实现相同的目的:修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie;删除时只需要把有效时间设置为0即可。

九.Cookie的优缺点

优点:

1.不需要占用服务器资源(保存在客户端的本地),分担了服务器存储的负担

2.Cookie 是基于文本的轻量结构,包含简单的键值对(结构简单)。

3.可操作性强,数据持久性强(方便用户的操作)

4.极高的扩展性和可用性

5.用户可选择客户端禁用Cookie

缺点:

1.大小数量受限(有时不能满足针对没有需求的开发)

2.安全性,隐私性不高(因为Cookie保存在客户端本地,这就造成Cookies有可能被盗用或篡改,用户信息会受到损害)

3.Cookie的无用性,造成带宽浪费(我们执行某一个操作时,可能有一些Cookie是无用的,但是它还是随着请求发送到服务端)

4.为保证Cookie安全性进行加密,解密影响应用程序的性能

十.Cookie的默认使用规范

1.尽量不保存用户个人的私人信息

2.通过加密和安全传输技术(SSL),减少Cookie被破解的可能性

3.让用户有选择是否保存个人信息的权利

4.过大的数据不使用Cookie保存

5.控制Cookie的有效时间,减少被恶意的获取到有效的Cookie

若是哪里有理解错误的或写错的地方,望各位读者评论或者私信指正,不胜感激。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值