写点什么

接口测试经典面试题:Session、cookie、token 有什么区别?

  • 2022-10-12
    北京
  • 本文字数:2955 字

    阅读完需:约 10 分钟

HTTP 是一个没有状态的协议,这种特点带来的好处就是效率较高,但是缺点也非常明显,这个协议本身是不支持网站的关联的,比如https://ceshiren.com/https://ceshiren.com/t/topic/9737/7这两个网站,必须要使用别的方法将它们两个关联起来。那就是 session 、cookie 、token。


session 即会话,是一种持久网络协议,起到了在用户端和服务器端创建关联,从而交换数据包的作用。


cookie 是“小型文本文件”,是某些网站为了辨别用户身份,进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。


token 在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀请、登录系统使用。


演示环境搭建


与 get、post 区别实战详解 章节相同,为了避免其他因素的干扰,使用 Flask 编写一个简单的 demo server(Flask 的安装与启动参考 get、post 区别实战详解 章节),来演示 cookie 与 session。


demo server 演示代码


from flask import Flask,session,Request, request,make_responseapp = Flask(name)request: Requestapp.secret_key = "key"@app.route('/')def hello_world():return 'Hello, World!'@app.route("/session")def session_handle():#读取请求 for k, v in request.args.items():#收到请求后写入 sessionsession[k] = v#创建服务器响应,将 session 的内容打印出来 resp = make_response({k: v for k, v in session.items()})for k, v in request.args.items():#给服务器设置 cookie,并添加 cookie 字符串进行标识 resp.set_cookie(f"cookie_{k}", v)return resp


分析 session、cookie、token


session、cookie 区别演示首先使用浏览器的无痕模式对演示网站发起访问,并传入 a、b 两个参数 以一次请求为例,查看 cookie 的传递过程


第一次请求的请求头信息如下,可以看到没有任何的 cookie 信息:


GET /session?a=1&b=2 HTTP/1.1Host: 127.0.0.1:5000Connection: keep-alivePragma: no-cacheCache-Control: no-cachesec-ch-ua: " Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"sec-ch-ua-mobile: ?0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9Sec-Fetch-Site: noneSec-Fetch-Mode: navigateSec-Fetch-User: ?1Sec-Fetch-Dest: documentAccept-Encoding: gzip, deflate, brAccept-Language: en


第一次请求的响应头信息,对客户端返回了 set-cookie 字段:


HTTP/1.0 200 OKContent-Type: application/jsonContent-Length: 18Set-Cookie: cookie_a=1; Path=/Set-Cookie: cookie_b=2; Path=/Vary: CookieSet-Cookie: session=eyJhIjoiMSIsImIiOiIyIn0.YKSvNA.2sSLXbraXxQ-MfKOLhoLJPZmV9U; HttpOnly; Path=/Server: Werkzeug/1.0.1 Python/3.8.7Date: Wed, 19 May 2021 06:24:52 GMT


第二次请求的请求头信息,客户端向服务端请求时请求头多出了一个 cookie 信息,并提交了和第二次 set-cookie 相同的信息:


GET /session?a=1&b=2 HTTP/1.1Host: 127.0.0.1:5000...省略...Cookie: cookie_a=1; cookie_b=2; session=eyJhIjoiMSIsImIiOiIyIn0.YKSvNA.2sSLXbraXxQ-MfKOLhoLJPZmV9U


当用户访问带 cookie 浏览器时,这个服务器就为这个用户产生了唯一的 cookie,并以此作为索引在服务器的后端数据库产生一个项目,接着就给客户端的响应报文中添加一个叫做 Set-cookie 的首部行,格式为 k:v。


这样当该用户下次再访问此网站时,就会在对服务器发起请求的时候添加一个名 Cookie 的首部行。浏览器由此就可以得知用户的身份,从而用户就不需要再次重新输入一些个人信息。


使用 curl 命令对网站发起了一个 get 请求,并传入 a、b 两个参数


curl 'http://127.0.0.1:5000/session?a=1&b=2' -v -s &>session


查看 session 文件内的请求以及响应内容


  • Trying 127.0.0.1...

  • TCP_NODELAY set* Connected to 127.0.0.1 (127.0.0.1) port 5000 (#0)> GET /session?a=1&b=2 HTTP/1.1


Host: 127.0.0.1:5000User-Agent: curl/7.64.1Accept: /


  • HTTP 1.0, assume close after body< HTTP/1.0 200 OK< Content-Type: application/json< Content-Length: 18< Set-Cookie: cookie_a=1; Path=/< Set-Cookie: cookie_b=2; Path=/< Vary: Cookie< Set-Cookie: session=eyJhIjoiMSIsImIiOiIyIn0.EWX6Qg.M8tEGPyRhlf0iUiLktEqup-4e-U; HttpOnly; Path=/< Server: Werkzeug/1.0.1 Python/3.7.5<{ [18 bytes data]* Closing connection 0{"a":"1","b":"2"}


从上面可以发现,与上一章节内容不同的是响应值多出了 3 个 Set-Cookie 字段。下面有一个 Set-Cookie 显示为 session=eyJhIjoiMSIsImIiOiIyIn0.EWX6Qg.M8tEGPyRhlf0iUiLktEqup-4e-U; HttpOnly; Path=/,由此可见 session 一般是加密串格式,可以通过 cookie 传递。


token 演示 token 的使用有一个非常经典的场景,就是在 github 中的使用。在 github->settings->Developer settings->Personal access tokens 中,可以生成一个 token 用于访问 github 的 api,这个 token 是没有时效性的,“任何人”可以使用它们代替通过 HTTPS 的 Git 密码,也可以用来通过基本身份验证向 API 进行身份验证。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RazeKoSl-1664261748192)(upload://kkgqOsGyz8ujhMFKucLN3WKWxE5.png)]


使用 OAuth 令牌对 GitHub API 进行身份验证(因返回结果个人信息太多所以省略展示)


token https://api.github.com/user


token 是无状态的,客户端传递用户数据给服务端后,服务端将数据加密就生成了 token 并传回给客户端。这样客户端每次访问时都传递 token,而服务端解密 token 之后,即可了解客户的信息。


在 github 中,token 只会生成一次,且不会过期,不过在很多其他的 web 应用网站,token 会存在过期机制。


session、cookie、token 的区别


@startumlautonumbertitle session、cookie 过程 participant 客户端 as cparticipant 服务器 as s


c -> s: 第一次请求 s -> s: 创建 SessionID 并保存 s -> c: 返回 SessionID,并 Set-Cookiec -> c: Cookie 保存\n 在浏览器 c -> s: 第二次请求,请求中携带 Cookie 和 SessionIds -> s: 判断 SessionId\n 属于哪个用户 s -> c: 响应


@enduml


@startumlautonumbertitle token 身份验证流程


participant 客户端 as cparticipant 服务器 as s


c -> s: 第一次请求,携带用户信息(账户、密码)s -> s: 用户信息加密\n 之后得到 tokens -> c: 返回 tokenc -> s: 请求时携带 tokens -> s: 对 token 解密之后做认证 s -> c: 响应


@enduml


session 存储在服务器端,cookie 存储在客户端。


cookie 可设置为长时间保持,session 一般失效时间较短,客户端关闭(默认情况下)或者 session 超时都会失效。


session 记录会话信息,token 不会记录会话信息。token 是无状态的。


点击下方链接免费领取:性能测试+接口测试+自动化测试+测试开发+测试用例+简历模板+测试文档

http://qrcode.testing-studio.com/f?from=infoQ&url=https://ceshiren.com/t/topic/22265

用户头像

社区:ceshiren.com 微信:ceshiren2021 2019-10-23 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料,实时更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬。

评论

发布
暂无评论
接口测试经典面试题:Session、cookie、token有什么区别?_霍格沃兹测试开发学社_InfoQ写作社区