写点什么

Cookie 简介

2019 年 11 月 18 日

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:



上图表明: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,效果如下图:



相关代码如下:


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,效果如下图:



相关代码如下:


    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


2019 年 11 月 18 日 18:23913

评论

发布
暂无评论
发现更多内容

利用 Python 爬取了 13966 条运维招聘信息,我得出了哪些结论?

JackTian

Python Linux 运维 数据分析 招聘

Java 后端博客系统文章系统——No2

猿灯塔

肖风:数据要素市场与分布式AI平台

CECBC区块链专委会

区块链+高考,让世界再无冒名顶替

CECBC区块链专委会

SpringBoot入门:00 - 初始化项目

封不羁

Spring Boot java 14

性能碾压 POI !利用模板语法快速生成 Excel 报表

Geek_Willie

表格控件 GCExcel 服务器端开发

流水账

zack

HTTP/2 总结

guoguo 👻

Java集合总结,从源码到并发一路狂飙

给你买橘子

Java 编程 算法 集合

编程能力 —— 异步编程

wendraw

Java 前端进阶训练营 编程能力

领域驱动设计(DDD)实践之路(一)

vivo互联网技术

架构 领域驱动设计 DDD

【写作群星榜】6.27~7.10 写作平台优秀作者 & 文章排名

InfoQ写作平台官方

写作平台 排行榜

Docker基础修炼3--Docker容器及常用命令

黑马腾云

Docker Linux 命令 容器技术

【Java虚拟机】垃圾收集器与内存分配

烫烫烫个喵啊

Java Java虚拟机

亚马逊:让创新科技成为重启世界的新动能

爱极客侠

开发者必备——IDEA配置清单

Noneplus

配置 IDEA

图片处理不用愁,给你十个小帮手

阿宝哥

Java 前端 工具 开源项目 图片

漫画通信:一图看懂通信发展史

阿里云Edge Plus

最大的 String 字符长度是多少?

武培轩

Java 源码 后端 JVM

5分钟上手部署!!!

清风

Java Spring Boot

信创舆情一线--《关键信息基础设施安全保护条例》纳入2020年立法计划

统小信uos

信息安全

编程能力 —— 寻路问题

wendraw

Java 前端进阶训练营 编程能力

积极支持EdgeX发展,英特尔为2020 EdgeX中国挑战赛获奖队伍创造广阔合作空间

最新动态

编程能力 —— 解析表达式

wendraw

Java 前端进阶训练营 编程能力

30 张图带你分分钟看懂进程和线程基础知识全家桶

爱嘤嘤嘤斯坦

Java 线程 进程 进程线程区别

DDD实施过程中的点滴思考

Winfield

领域驱动设计 DDD

啃碎并发(八):深入分析wait&notify原理 猿码架构

猿灯塔

还在划水?这个SQL你能写出来吗?

书旅

php MySQL SQL语法 sql查询

数据结构与算法知识点总结

hiqian

LR.Net平台研发轶事,每一个点都很难,但我们不将就

力软.net/java开发平台

C# .net 跨平台 框架开发

521我发誓读完本文,再也不会担心Spring配置类问题了

YourBatman

spring springboot @Configuration Spring配置类

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

Cookie简介-InfoQ