WKWebView详解(三)Cookie的认识

WKWebView文章汇总

主要内容:

  1. Cookie认识
  2. NSHTTPCookie
  3. 六大特性

1. Cookie认识

我们通过的服务器和客户端进行交互往往是通过https/http请求完成的,而这个协议是无连接的,但有时候我们的业务中需要实现多次请求是有一定关联性的,所以就需要约定一个信息供客户端和服务器端进行识别,这里就是用到了Cookie和Session。
客户端请求时携带上Cookie,服务器端进行识别,识别后就可以进行处理,Cookie中携带的最重要的信息就是SessionID,这个ID就可以查询到服务器端保存的Session,Session中保存了大量的该用户信息,识别后就可以通过这些用户信息对这个请求进行处理。

在WKWebView中,我们能做的就是对Cookie进行处理

作用:

  • 会话状态管理(如用户登录状态)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

1.1 过程

客户端在一次给服务器端发送请求时,服务器端会生成一个Cookie返回给给客户端,客户端在下一次请求发送时会携带上该Cookie,这样后续请求就可以使用该Cookie来识别。

  1. 创建Cookie,当服务器收到HTTP请求时,会创建一个Cookie,并在响应头中添加一个Set-Cookkie的选项,附着上Cookie
  2. Cookie使用,客户端在收到该Cookie后,在下次发送请求时,就会在Cookie选择中携带上可以匹配的Cookie
  3. Cookie识别,服务器端在收到客户端的请求后,就会识别Cookie中的SessionID,以此查找Session,查找到后就可以使用Session信息来处理该请求

1.2 Cookie属性认识

Expires:

  • 最长有效时间,Cookie可以存活的时间(旧属性)
  • 如果没有设置,那么时间就是一个会话期,也就是如果客户端被关掉,则Cookie就会被移除
  • 然而,很多Web浏览器支持会话恢复功能,这个功能可以使浏览器保留所有的tab标签,然后在重新打开浏览器的时候将其还原。与此同时,cookie 也会恢复,就跟从来没有关闭浏览器一样。

Max-Age:

  • 最大存活时间
  • 作用和Expires一样,但是Max-Age是新属性,如果同时存在,则优先使用Max-Age

Domain:

  • 该Cookie可被携带的主机名
  • 也就是发送请求中如果给该主机发送,那么就可以选择携带该Cookie(还需要判断Path)
  • 假如没有指定,那么默认值为当前文档访问地址中的主机部分(但是不包含子域名)
  • 与之前的规范不同的是,域名之前的点号会被忽略。
  • 假如指定了域名,那么相当于各个子域名也包含在内了。(也就是这里如果写了二级域名,那么二级域名相同的所有请求都可以携带该Cookie)

Path:

  • 该Cookie需要被携带的路径
  • 也就是发送请求中如果给该地址发送,那么就可以选择使用该Cookie(还需要判断主机)
  • 目录的下级目录也满足匹配的条件。(例如,如果 path=/docs,那么 "/docs", "/docs/Web/" 或者 "/docs/Web/HTTP" 都满足匹配的条件)

Secure:

  • 一个带有安全属性的 cookie 只有在请求使用SSL和HTTPS协议的时候才会被发送到服务器。
  • 也就是说这个Cookie如果设置有Secure,那么这个请求只能是HTTPS协议,否则无法发送

HttpOnly:

  • 设置了 HttpOnly 属性的 cookie 不能使用 JavaScript 经由 Document.cookie 属性、XMLHttpRequest 和 Request APIs 进行访问,以防范跨站脚本攻击(XSS (en-US))。

SameSite:

  • 允许服务器设定一则 cookie 不随着跨域请求一起发送,这样可以在一定程度上防范跨站请求伪造攻击

2. NSHTTPCookie

2.1 创建Cookie

//使用提供的属性创建并初始化一个HTTP cookie对象。
- (nullable instancetype)initWithProperties:(NSDictionary<NSHTTPCookiePropertyKey, id> *)properties;

//用给定的cookie属性初始化一个HTTP cookie对象。
+ (nullable NSHTTPCookie *)cookieWithProperties:(NSDictionary<NSHTTPCookiePropertyKey, id> *)properties;

为提供的URL创建一个与提供的响应报头字段对应的HTTP cookie数组。
+ cookiesWithResponseHeaderFields:forURL:

2.2 设置Cookie到请求头

//将cookie数组转换为报头字段的字典。
+ (NSDictionary<NSString *, NSString *> *)requestHeaderFieldsWithCookies:(NSArray<NSHTTPCookie *> *)cookies;

2.3 获取Cookie主机属性

@property (readonly, copy) NSString *domain;

@property (readonly, copy) NSString *path;

@property (nullable, readonly, copy) NSArray<NSNumber *> *portList;

2.4 得到Cookie元数据

@property (readonly, copy) NSString *name;

@property (readonly) NSUInteger version;

@property (readonly, copy) NSString *value;

2.5 确定Cookie生命周期

//过期时间
@property (nullable, readonly, copy) NSDate *expiresDate;

//一个布尔值,指示是否应该在会话结束时丢弃cookie(无论过期日期如何)。
@property (readonly, getter=isSessionOnly) BOOL sessionOnly;

2.6 Cookie安全

//一个布尔值,指示是否该cookie应该只发送到HTTP服务器。
@property (readonly, getter=isHTTPOnly) BOOL HTTPOnly;

//一个布尔值,指示是否只能通过安全通道发送cookie。
@property (readonly, getter=isSecure) BOOL secure;

//一个布尔值,指示是否将cookie限制为发送回创建它的同一站点的请求。
@property (nullable, readonly, copy) NSHTTPCookieStringPolicy sameSitePolicy

2.7 访问Cookie属性

//Cookie属性
@property (nullable, readonly, copy) NSDictionary<NSHTTPCookiePropertyKey, id> *properties;

//在cookie属性字典中定义支持键的常量。可直接查找文档
NSHTTPCookiePropertyKey

2.8 获取用户可读的Cookie元数据

//返回接收方的comment
@property (nullable, readonly, copy) NSString *comment;

//返回接收方的comment URL
@property (nullable, readonly, copy) NSURL *commentURL;

3. 六大特性

3.1 Cookie的生命周期

会话期Cookie: 仅作用在会话期,浏览器关闭 后就会被自动删除,会话期Cookie不需要指定Expires或Max-Age部分浏览器提供了恢复会话功能,即使关闭浏览器,会话期Cookie也会被保留下来

持久性Cookie: 生命周期取决于Expires或Max-Age指定的时间(设定的时间只与客户端相关,而不是服务器端)

3.2 限制访问 Cookie

有两种方法可以确保Cookie被安全的发送,并且不会被以外的参与者或脚本访问,Secure属性和HttpOnly属性

Secure属性:
只应通过被 HTTPS 协议加密过的请求发送给服务端,因此可以预防 man-in-the-middle 攻击者的攻击。但即便设置了 Secure 标记,敏感信息也不应该通过 Cookie 传输。因为 Cookie 有其固有的不安全性,Secure 标记也无法提供确实的安全保障。

HttpOnly属性:
JavaScript Document.cookie API 无法访问带有 HttpOnly 属性的cookie,此类 Cookie 仅作用于服务器
例如,持久化服务器端会话的 Cookie 不需要对 JavaScript 可用,而应具有 HttpOnly 属性。
此预防措施有助于缓解跨站点脚本(XSS) (en-US)攻击。

3.3 Cookie 的作用域

Domain 和 Path 标识定义了Cookie的作用域:即允许 哪些请求携带Cookie 。

Domain 属性:
Domain 指定了哪些主机可以接受 Cookie。如果不指定,默认为 origin,不包含子域名。如果指定了Domain,则一般包含子域名。

Path属性:
Path 标识指定了主机下的哪些路径可以接受 Cookie

SameSite attribute:
SameSite Cookie 允许服务器要求某个 cookie 在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击(CSRF)

  • None: 浏览器会在同站请求、跨站请求下继续发送 cookies,不区分大小写。
  • Strict: 浏览器将只在访问相同站点时发送 cookie。(在原有 Cookies 的限制条件上的加强,如上文 “Cookie 的作用域” 所述)
  • Lax: 与 Strict 类似,但用户从外部站点导航至URL时(例如通过链接)除外。在新版本浏览器中,为默认选项,Same-site cookies 将会为一些跨站子请求保留,如图片加载或者 frames 的调用,但只有当用户从外部站点导航到URL时才会发送。如 link 链接

Cookie prefixes:
对于子域访问的特性,会出现这种情况:子域上的易受攻击的应用程序可以使用 Domain 属性设置 cookie,从而可以访问所有其他子域上的该 cookie。因此cookie 的机制使得服务器无法确认 cookie 是在安全来源上设置的,甚至无法确定 cookie 最初是在哪里设置的。

3.4 安全

Cookie中的信息是可以被访问和修改的,因此具有不安全性,需要设置身份验证/机密机制,并且如果没有设置安全环境时,不能通过Cookie存储、传输敏感信息。

  • 使用 HttpOnly 属性可防止通过 JavaScript 访问 cookie 值。
  • 用于敏感信息(例如指示身份验证)的 Cookie 的生存期应较短,并且 SameSite 属性设置为Strict 或 Lax。

3.5 会话劫持和XSS

在 Web 应用中,Cookie 常用来标记用户或授权会话。因此,如果 Web 应用的 Cookie 被窃取,可能导致授权用户的会话受到攻击。
常用的窃取 Cookie 的方法有利用社会工程学攻击和利用应用程序漏洞进行 XSS (en-US) 攻击。

HttpOnly 类型的 Cookie 用于阻止了JavaScript 对其的访问性而能在一定程度上缓解此类攻击。

3.6 跨站请求伪造(CSRF)

在本站点发送其他站点的请求,以达到恶意获取请求信息的目的,比如在不安全聊天室或论坛上的一张图片,它实际上是一个给你银行服务器发送提现的请求:当你打开含有了这张图片的 HTML 页面时,如果你之前已经登录了你的银行帐号并且 Cookie 仍然有效。

阻止方法:

  • 对用户输入进行过滤来阻止
  • 任何敏感操作都需要确认;
  • 用于敏感信息的 Cookie 只能拥有较短的生命周期
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容