[闲聊] 2017.W11 - Cookie vs Session

楼主: CMJ0121 (请多指教!!)   2017-03-14 23:47:17
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
作者: supermario85 (mario大叔)   2017-03-15 07:43:00
感谢分享,谢谢
作者: tiefblau (tiefblau)   2017-03-16 10:59:00
顺带一提 会有过期机制~
作者: qqdn ( )   2017-03-18 07:00:00
感谢分享
作者: johnkk6j   2017-03-21 16:20:00
希望下次可以分享一些无线网络的安全机制~~感谢大大~
楼主: CMJ0121 (请多指教!!)   2017-03-21 22:24:00
楼上的意见我收到了... 给我点时间学学不然就要看板上出没的大大分享一下心得了

Links booklink

Contact Us: admin [ a t ] ucptt.com