Cookie 简介

阅读数:193 2019 年 11 月 18 日 18:23

Cookie简介

1 Cookie 是什么

  • Cookie

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据 (通常经过加密)。360 百科 Cookie

插曲 Session

  • Session

由于 HTTP 协议是无状态的协议,所以当服务端需要记录用户状态时,就需要用某种机制来识别具体的用户,这个机制就是 Session。

2 Cookie 有什么用

笔者以简书显示内容为繁体还是简体为例,来介绍 Cookie 的用处:

(1)当我们使用浏览器访问 jianshu.com 时,简书服务端不知道浏览器的信息,默认情况下,浏览器显示内容为“简体”;

(2)当我们设置浏览器显示内容为“繁体”时,浏览器将显示繁体内容;

(3)当我们关闭浏览器,再重新打开浏览器,发现简书的显示内容仍然会是繁体;笔者认为原因是简书服务端可能给浏览器做了一个唯一标识的记录,放置到自己的 Session 中,当浏览器重启后,再去服务端请求简书内容,发现当前浏览器需要显示为繁体,便下发了繁体显示内容;

(4)如果没有使用 Cookie,因为 HTTP 协议是无状态的,那么我们设置的显示内容为繁体或者简体后,当我们打开新的页面或关闭浏览器重新打开的时候,之前设置的显示繁体或者简体便不存在了。

3 Cookie 的类型

摘自 HTTP 权威指南

笼统地说,Cookie 分为 2 类:会话 Cookie 和 持久 Cookie

会话 Cookie 是一种临时 Cookie,它记录用户访问长点是的设置和偏好。用户退出浏览器时,会话 Cookie 就被删除了。

持久 Cookie 的生存时间更长一些,他们存储在硬盘上,浏览器退出,计算机重启时,他们仍然存在。通常用持久 Cookie 维护某个用户会周期性访问的站点的配置文件或登录名。

会话 Cookie 和持久 Cookie 之间的唯一区别就是他们的过期时间。没有指定 Expires(过期时间)时,默认为会话 Cookie。

以简书为例:看下简书的会话 Cookie 和持久 Cookie:

Cookie简介

上图表明:jianshu.com 的 cookies

持久 Cookie:

  • expires 过期时间为 2018 年 4 月 9 日星期二 Tue,09 Apr 2019 13:31:57 -0000
  • 笔者猜测这个值表示的意思是当前的某个时间减去 0000,以达到作为持久 Cookie 的目的
  • domain 为.jianshu.com
  • Path 为 /
  • Secure 为 YES
  • Http only 为 true;

会话 Cookie:

  • local:zh-CN 显示为简体 ;

包括会话 Cookie,笔者以为关闭浏览器后会话 Cookie 就会消失,不过笔者的如下测试结果,不确定算不算是会话 Cookie 消失的一种体现。首次启动浏览器显示的会话 Cookie 为:

复制代码
local:zh-CN;
path:/;
default_font:font1;

设置过繁体的情况:

复制代码
local:zh-TW;
path:/;
default_font:font1;

然后刷新 jianshu.com,显示内容,就只会显示

复制代码
local:zh-CN

或是

复制代码
local:zh-TW

不确定这个算不算是会话 Cookie 在关闭浏览器后,就消失了。读者也可以自己测试一下。有做服务端的同学知道的话,敬请告知。

4 Cookie 的工作流程

笔者仍以浏览器打开简书显示内容字体为“简体”或是“繁体”为例阐述 Cookie 的工作流程。

(1)当我们使用浏览器首次访问 jianshu.com 时,简书服务端不知道浏览器的信息,默认情况下,浏览器显示内容为“简体”。服务端对浏览器创建一个 Session;

(2)当我们设置浏览器显示内容为“繁体”时,会通过 Cookie 的方式设置 local 为 zh-TW,给服务端发送请求,并且得到的响应会是设置浏览器的显示内容为“繁体”,服务端同事会更新 Session 中的信息为 zh-TW(繁体);

(3)当我们关闭浏览器,会话消失的情况下,然后我们再重新打开浏览器,发现简书的显示内容仍然会是繁体,笔者认为这个是因为简书服务端 Session 存储着浏览器应该显示字体,(比如服务端存储着浏览器的某个唯一的 id,然后当重新打开浏览器,对服务端做请求时,服务端根据之前的 Session 下发繁体内容)。

5 Cookie 的属性

  • Domain(域):Cookie 的域;浏览器只向指定域中的服务器主机名发送 Cookie,这样服务器就将 Cookie 限制在了特定的域中。jianshu.com 域就与 jianshu1.jianshu.com 和 jianshu1.jianshu2.jianshu.com 相匹配,但与 js.com 就不匹配了。
  • Path(路径):通过这个属性可以为服务器上特定的文档分配 Cookie,如果 Path 属性是一个 URL 路径前缀,就可以附加一个 Cookie,路径 /foo,与 /foobar 和 foo/bar.html 相匹配,路径 "/" 与域名中所有的内容都匹配。
  • Secure(安全):是否只有在 HTTP 使用 SSL 连接时才发送这个 Cookie;
  • expires(过期):从格林尼治标准时间 1970 年 1 月 1 日 00:00:00 开始的过期秒数;
  • name(名字):Cookie 变量的名字;
  • value(值):Cookie 变量的值;

6 iOS 中 NSHTTPCookie

常用属性:

  • NSHTTPCookieDomain domain:cookie 的域;
  • NSHTTPCookiePath path:Cookie 的 path;
  • NSHTTPCookiePort portList:Cookie 的端口列表;
  • NSHTTPCookieName name:Cookie 的名字;
  • NSHTTPCookieValue value:Cookie 的值;
  • NSHTTPCookieVersion version: Cookie 的版本;
  • NSHTTPCookieExpires expireDate:Cookie 的过期时间;
  • NSHTTPCookieDiscard sessionOnly:一个布尔值,表示 cookie 是否应该在会话结束的时候被丢弃(不管过期日期);
  • HTTPOnly:指定客户端不要与 JavaScript 应用共享 Cookie,以防止跨站脚本攻击;
  • NSHTTPCookieSecure secure:指定 Cookie 只会用在 HTTPS 连接而非 HTTP 连接;
  • properties:Cookie 的属性;
  • NSHTTPCookiePropertyKey:定义 cookie 属性字典中支持的常量;
  • NSHTTPCookieComment comment:Cookie 的说明文字
  • NSHTTPCookieCommentURL commentURL:cookie 的说明 URL;
  • NSHTTPCookieAcceptPolicy:Cookie 的访问权限,NSHTTPCookie 由 NSHTTPCookieStorage 管理。

NSHTTPCookieAcceptPolicyAlways:存储所有的 cookie;
NSHTTPCookieAcceptPolicyNever:不会存储 cookie;
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:只保存域值和请求域相匹配的 Cookie;

7 iOS 网络请求使用 Cookie

客户端的请求头里边的 cookie 的 header,key 为 "cookie"

服务端响应客户端的时候,响应头中的 cookie 的 header,key 为 "set-cookie"

网络请求使用 AFN 携带 Cookie 测试 AFN 网络请求携带 Cookie,笔者使用的是访问 juejin.im 的时候携带 Cookie,效果如下图:

Cookie简介

相关代码如下:

复制代码
NSString *urlString = @"https://juejin.im"; AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];
[sessionManager.requestSerializer setValue:@"QiShareNameAFN=QiShareValueAFN;QiShareTokenAFN=QiShareTokenValueAFN" forHTTPHeader
[sessionManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable respons
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];

当需要设置多个 cookie 值的时候,使用 cookieKey1=cookieValue1 ;cookieKey2=cookieValue2; 的方式,使用分号分隔开每一对 cookieKey 及 Value。

  • 网络请求使用 NSURLSession 携带 Cookie

测试 NSURLSession 网络请求携带 Cookie,笔者使用的是访问 jianshu.com 的时候携带 Cookie,效果如下图:

Cookie简介

相关代码如下:

复制代码
NSURL *url = [NSURL URLWithString:@"https://www.jianshu.com"];
NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:url];
mRequest.HTTPMethod = @"GET”;
[mRequest setValue:@"QiShareName=QiShareValue;QiShareToken=QiShareTokenValue" forHTTPHeaderField:@"cookie"];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:mRequest completionHandler:^(NSData * _Nullable data, NSURLRespon
}];
[dataTask resume];

本文转载自公众号 360 云计算(ID:hulktalk)。

原文链接:

https://mp.weixin.qq.com/s/Mrof5K0OA7oHh9h3cRk85A

评论

发布