HTTP Cookie

Cookie 指某些网站为了辨别用户身份而存储在用户本地终端(client side)上的数据(通常经过加密)。
 
Cookie 总是保存在客户端,按存储位置,可以分内存 Cookie 和硬盘 Cookie
  • 内存 cookie 由浏览器维护,保存在内存中,浏览器关闭后消失,其存在时间比较短。
  • 硬盘cookie 保存在硬盘里,有一个过期时间,除非用户手动清理或到了过期时间,硬盘cookie不会被删除。
 
因为HTTP协议是无状态的,即服务器不知道用户上次做了什么,所以服务器通过设置或读取cookie中包含的信息,借此维护用户和服务器会话中的状态。
 
Cookie 类型
Session Cookie
     这个类型的cookie只在会话期间内有效,即当关闭浏览器的时候,它会被浏览器删除。设置session cookie的办法是:在创建cookie不设置Expires即可。
Persistent Cookie
     持久型cookie顾名思义就是会长期在用户会话中生效。当你设置cookie的属性Max-Age为1个月的话,那么在这个月里每个相关URL的http请求中都会带有这个cookie。所以它可以记录很多用户初始化或自定义化的信息,比如什么时候第一次登录及弱登录态等。
Secure cookie
     安全cookie是在https访问下的cookie形态,以确保cookie在从客户端传递到Server的过程中始终加密的。这样做大大的降低的cookie内容直接暴露在黑客面前及被盗取的概率。
HttpOnly Cookie
     目前主流的浏览器已经都支持了httponly cookie。1.IE5+ 2.Firefox 1.0+ 3.Opera 8.0+ 4.Safari/Chrome。在支持httponly的浏览器上,设置成httponly的cookie只能在http(https)请求上传递。也就是说httponly cookie对客户端脚本语言(javascript)无效,从而避免了跨站攻击时JS偷取cookie的情况。当你使用javascript在设置同样名字的cookie时,只有原来的httponly值会传送到服务器。
 
Cookie 实现
技术分享
除了name=value对以外,我们还可以设置Cookie其他属性以支持更丰富的Cookie需求,这些属性通常是浏览器用来判断如何对待cookie,何时删除、屏蔽或者如何发送name-value对给Server。也就是说无论我们设置了某个cookie的多少属性,这些Cookie属性是不会被浏览器发送回给Server的。
 
Cookie 的缺陷
  • cookie会被附加在每个HTTP请求中,增加了流量
  • 由于在HTTP请求中的cookie是明文传递的,所以安全性成问题(除非使用HTTPS)
  • cookie的大小限制在4k左右,对应复杂的存储需求是不够用的
 
Cookie 常用场景
(1)很多网站上的“下次自动登录”功能,就是通过发送保存在cookie中的用户名和密码的某种加密形式的登录凭证
(2)购物网站在结算时,读取保存在cookie中的购买商品
 
在 chrome 设置->隐私设置->内容设置->所有cookie和网站数据 查看cookie 结构
 
技术分享
 
NSHTTPCookie 中cookie 结构
 
// cookie 结构
FOUNDATION_EXPORT NSString * const NSHTTPCookieName;
FOUNDATION_EXPORT NSString * const NSHTTPCookieValue;
FOUNDATION_EXPORT NSString * const NSHTTPCookieOriginURL;
FOUNDATION_EXPORT NSString * const NSHTTPCookieVersion;
FOUNDATION_EXPORT NSString * const NSHTTPCookieDomain;
FOUNDATION_EXPORT NSString * const NSHTTPCookiePath;
FOUNDATION_EXPORT NSString * const NSHTTPCookieSecure;
FOUNDATION_EXPORT NSString * const NSHTTPCookieExpires;
FOUNDATION_EXPORT NSString * const NSHTTPCookieComment;
FOUNDATION_EXPORT NSString * const NSHTTPCookieCommentURL;
FOUNDATION_EXPORT NSString * const NSHTTPCookieDiscard;
FOUNDATION_EXPORT NSString * const NSHTTPCookieMaximumAge;
FOUNDATION_EXPORT NSString * const NSHTTPCookiePort;
 
// 设置cookie类型
@property (readonly, getter=isSessionOnly) BOOL sessionOnly;
@property (readonly, getter=isHTTPOnly) BOOL HTTPOnly;
 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。