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

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

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

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

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

<strong>演示环境搭建</strong>

与 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():

    #收到请求后写入session

        session[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

```

<strong>分析 session、cookie、token</strong>

session、cookie 区别演示

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

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

```

GET /session?a=1&b=2 HTTP/1.1

Host: 127.0.0.1:5000

Connection: keep-alive

Pragma: no-cache

Cache-Control: no-cache

sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"sec-ch-ua-mobile: ?0

Upgrade-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.36

Accept: 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.9

Sec-Fetch-Site: none

Sec-Fetch-Mode: navigate

Sec-Fetch-User: ?1

Sec-Fetch-Dest: document

Accept-Encoding: gzip, deflate, br

Accept-Language: en

```

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

```

HTTP/1.0 200 OK

Content-Type: application/json

Content-Length: 18Set-Cookie: cookie_a=1; Path=/

Set-Cookie: cookie_b=2; Path=/

Vary: Cookie

Set-Cookie: session=eyJhIjoiMSIsImIiOiIyIn0.YKSvNA.2sSLXbraXxQ-MfKOLhoLJPZmV9U; HttpOnly; Path=/

Server: Werkzeug/1.0.1 Python/3.8.7

Date: Wed, 19 May 2021 06:24:52 GMT

```

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

```

GET /session?a=1&b=2 HTTP/1.1

Host: 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:5000

> User-Agent: curl/7.64.1

> Accept: */*

>

* 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 进行身份验证。


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

```

$ curl -u username:$token https://api.github.com/user

```

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

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

**session、cookie、token 的区别**

```

@startuml

autonumber

title session、cookie过程

participant 客户端 as c

participant 服务器 as s

c -> s: 第一次请求

s -> s: 创建SessionID并保存

s -> c: 返回SessionID,并Set-Cookie

c -> c: Cookie保存\n在浏览器

c -> s: 第二次请求,请求中携带Cookie和SessionId

s -> s: 判断SessionId\n属于哪个用户

s -> c: 响应

@enduml

```

```

@startuml

autonumber

title token身份验证流程

participant 客户端 as c

participant 服务器 as s

c -> s: 第一次请求,携带用户信息(账户、密码)

s -> s: 用户信息加密\n之后得到token

s -> c: 返回token

c -> s: 请求时携带token

s -> s: 对token解密之后做认证

s -> c: 响应

@enduml

```

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

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

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

推荐学习

https://qrcode.ceba.ceshiren.com/link?name=article&project_id=qrcode&from=jianshu&timestamp=1662800722&author=DongL

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

推荐阅读更多精彩内容