作者CMJ0121 (请多指教!!)
看板NetSecurity
标题[闲聊] 2017.W11 - Cookie vs Session
时间Tue Mar 14 23:47:17 2017
2017.W11 - Cookie vs Session
> 就算今天是抱抱星期二 我还是要称今天是 Pi-Day
## 前言 ##
虽然是老梗 但是还是替大家复习一下 Cookie 跟 Session 的差别
不然下次搞混真的会让人无言
## 内容 ##
在提到 Cookie 与 Session 之前 需要先了解一下 HTTP 的架构
HTTP[0] 是一种广泛使用的网路协定 (如果你透过网页浏览 PTT 那就是在使用 HTTP)
目前最广泛使用的是用 RFC 2616[1] 的 HTTP/1.1
已经完成的 RFC 7540 (HTTP/2) 则有机会成为新的标准
在 HTTP 的世界当中 请求本身是无状态的 (stateless)
这表示任意两个请求之间 本身是没有关联 (储存状态)
但现在的网路使用中 (排除匿名浏览) 网站都可以记录你上次的
1. 浏览纪录
2. 搜寻结果
3. 登入帐号
4. ...
这就跟 HTTP 的无状态特性相违背 (?) 而 Cookie 就是处理这个需求的产物
Cookie 是定义在 RFC 2109 的一个实作
本身储存一个特殊的字串 (有大小限制) 在浏览网页的时候一并送给网页伺服器
而伺服器会根据当初设计的逻辑做特定的处理 像是
ptt.cc 就会利用 over18 来记录是否点击过已满 18 岁的纪录
在引入 Cookie 的概念後 HTTP 就有了状态的特性
但是明眼人一看就会发现问题:这个 Cookie 似乎随便带入都可以
假如有一个神奇的程式设计师 (我称之为 JW) 他设计了一个逻辑
1. 如果请求中没有 age 则跳出输入年龄的视窗
2. 如果请求中有 age 这个 Cookie 则显示 age 的内容
Cookie 本身因为是使用者可控的内容 所以伺服器永远无法保证这个内容的合法性
这里的合法性包含了正确性与内容不被修改
所以如果把帐号/密码资讯 放到 Cookie 当中就是一个
十分好的巧思
另一方面 Session[2] 则是一个 (相对) 用来保证安全的 Cookie
在实务上 Session 跟 Cookie 一样都放在请求当中
内容当然也可以被使用者控制、修改、窃取
然而 Session 本身在伺服器当中还会做额外的验证
这里的验证可以包涵:来源 IP (REMOTE_ADDRESS)、User Agent [3] 等
而 session 本身并不太带有任何的敏感资讯 (像是帐号内容 如果没有额外的巧思...)
相反的 Session 一个跟伺服器端的资料的对应关系
可以想像成:
伺服器已经知道帐号 S 登入了 并且对应到一个 Session ID 是 5538
当只有 IP 位址从 1.2.3.4 的请求 才会做 1-1 的对应
其他的则当作是无效 Session
## 同场加映 ##
有兴趣的人 也可以复习一下 Encoding、HASH、Encryption 之间的差异
在工作的时候 真的会有神奇的工程师混用这三者...
[0]:
https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
[1]:
https://tools.ietf.org/html/rfc2616
[2]:
https://en.wikipedia.org/wiki/Session_(computer_science)
[3]:
https://en.wikipedia.org/wiki/User_agent
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.193.122.171
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/NetSecurity/M.1489506440.A.4FC.html
1F:推 supermario85: 感谢分享,谢谢 03/15 07:43
2F:推 tiefblau: 顺带一提 会有过期机制~ 03/16 10:59
3F:推 qqdn: 感谢分享 03/18 07:00
4F:推 johnkk6j: 希望下次可以分享一些无线网路的安全机制~~感谢大大~ 03/21 16:20
5F:→ CMJ0121: 楼上的意见我收到了... 给我点时间学学 03/21 22:24
6F:→ CMJ0121: 不然就要看板上出没的大大分享一下心得了 03/21 22:24