接口测试基础-cookie、session、token学习
目的:了解cookie和session区别,并且了解app端为什么不用cookie、session,而用token。
一、了解cookie和session区别
我们在请求头中经常会见到如下的部分:
Cookie: ZC8sid=m5PMgK; AJSTAT_ok_pages=5; AJSTAT_ok_times=1;ZC8cookietime=2592000;ZC8_auth=e558Bn9amQVa818V1epYBenUnNCUXW7vdUc3XZdMLRsVI26O40Bd5CqE%2F4Oj47WW245X04JeCjpyiUxBDwBpiJEfI0dxow;checkpm=1; supe_cookietime=2592000;supe_loginuser=wg101523413;supe_activationauth=9f6dNKMyRfxDJ82LeRptq1GkxzAzGTsCTAcF9B6DTI94uxzoK%2FOo2A
在响应头中也经常看到set-cookie,那那么cookie是干嘛用的呢?和session的区别在哪儿呢?
通过图解http书中两张图学习一下:
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
从这两张图可以看出,cookie分为setCookie和Cookie,前者为响应头字段,后者为请求头字段;而请求头和响应头均包含Session ID,响应头包含的Session ID字段是为了记录用户认证状态,请求头中Session ID是方便服务端来判断客户端是否为真实的用户。接下来我们详细看下两者的区别:
1.session在服务器端,cookie在客户端(浏览器)
2.session默认被存在在服务器的一个文件里(不是内存)
3.session的运行依赖session id,而session id 是存在cookie 中的,也就是说,如果浏览器禁用了cookie ,同时session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
4.用户验证这种场合一般会用session
因此,维持一个会话的核心就是客户端的唯一标识,即session id ;cookie目的可以跟踪会话,也可以保存用户喜好或者保存用户名密码;session用来跟踪会话。
二、为什么app端为什么不用cookie、session,而用token
那么app中为什么很少看到用cookie或session,而要用token呢?这三者有什么区别呢?
首先了解下REST,即Representational State Transfer的缩写。我对这个词组的翻译是"表现层状态转化"。 简单来说,RESTful API 是基于HTTP协议产生的一种相对简单的API设计方案,属于无状态传输。RESTful 的核心是 everything is a “resource”,所有的HTTP action,都应该是相应resource上可以被操作和处理的,而API 就是对资源的管理操作,而这个具体操作是由 HTTP action 指定的。
App通常用restful API跟server打交道。Rest是stateless的,也就是app不需要像browser那样用cookie来保存session,因此用session token来标示自己就够了,session/state由API server的逻辑处理。
如果你的后端不是stateless的rest API, 那么你可能需要在app里保存session,可以在app里嵌入webkit,用一个隐藏的browser来管理cookie session.
session 和 oauth token 并不矛盾,作为身份认证token安全性比session好,因为每个请求都有签名sign(Sign怎么生成的:将所有用户请求的参数按照字母排序(包括timestamp,token),然后根据MD5加密(可以加点盐),生成sign签名,这就是所说的url签名算法。),所以token+sign还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。
参考资料:《图解HTTP》——[日]上野 宣