最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

接口測試經(jīng)典面試題:Session、cookie、token有什么區(qū)別?

2022-08-04 17:42 作者:愛測軟件測試  | 我要投稿

HTTP是一個(gè)沒有狀態(tài)的協(xié)議,這種特點(diǎn)帶來的好處就是效率較高,但是缺點(diǎn)也非常明顯,這個(gè)協(xié)議本身是不支持網(wǎng)站的關(guān)聯(lián)的,比如https://ceshiren.com/和https://ceshiren.com/t/topic/9737/7這兩個(gè)網(wǎng)站,必須要使用別的方法將它們兩個(gè)關(guān)聯(lián)起來。那就是session 、cookie 、token。

  • session 即會(huì)話,是一種持久網(wǎng)絡(luò)協(xié)議,起到了在用戶端和服務(wù)器端創(chuàng)建關(guān)聯(lián),從而交換數(shù)據(jù)包的作用。

  • cookie 是“小型文本文件”,是某些網(wǎng)站為了辨別用戶身份,進(jìn)行 session 跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密),由用戶客戶端計(jì)算機(jī)暫時(shí)或永久保存的信息。

  • token 在計(jì)算機(jī)身份認(rèn)證中是令牌(臨時(shí))的意思,在詞法分析中是標(biāo)記的意思。一般作為邀請、登錄系統(tǒng)使用。

演示環(huán)境搭建

與 get、post 區(qū)別實(shí)戰(zhàn)詳解 章節(jié)相同,為了避免其他因素的干擾,使用 Flask 編寫一個(gè)簡單的 demo server(Flask 的安裝與啟動(dòng)參考 get、post 區(qū)別實(shí)戰(zhàn)詳解 章節(jié)),來演示 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

? ? #創(chuàng)建服務(wù)器響應(yīng),將session的內(nèi)容打印出來

? ? resp = make_response({k: v for k, v in session.items()})

? ? for k, v in request.args.items():

? ? #給服務(wù)器設(shè)置cookie,并添加cookie字符串進(jìn)行標(biāo)識(shí)

? ? ? ? resp.set_cookie(f"cookie_{k}", v)

? ? return resp

分析 session、cookie、token

session、cookie 區(qū)別演示

首先使用瀏覽器的無痕模式對演示網(wǎng)站發(fā)起訪問,并傳入 a、b 兩個(gè)參數(shù) 以一次請求為例,查看 cookie 的傳遞過程

第一次請求的請求頭信息如下,可以看到?jīng)]有任何的 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

第一次請求的響應(yīng)頭信息,對客戶端返回了 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

第二次請求的請求頭信息,客戶端向服務(wù)端請求時(shí)請求頭多出了一個(gè) 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

當(dāng)用戶訪問帶 cookie 瀏覽器時(shí),這個(gè)服務(wù)器就為這個(gè)用戶產(chǎn)生了唯一的 cookie,并以此作為索引在服務(wù)器的后端數(shù)據(jù)庫產(chǎn)生一個(gè)項(xiàng)目,接著就給客戶端的響應(yīng)報(bào)文中添加一個(gè)叫做 Set-cookie 的首部行,格式為 k:v。

這樣當(dāng)該用戶下次再訪問此網(wǎng)站時(shí),就會(huì)在對服務(wù)器發(fā)起請求的時(shí)候添加一個(gè)名 Cookie 的首部行。瀏覽器由此就可以得知用戶的身份,從而用戶就不需要再次重新輸入一些個(gè)人信息。

使用 curl 命令對網(wǎng)站發(fā)起了一個(gè) get 請求,并傳入 a、b 兩個(gè)參數(shù)

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


查看 session 文件內(nèi)的請求以及響應(yīng)內(nèi)容


*? ?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"}

從上面可以發(fā)現(xiàn),與上一章節(jié)內(nèi)容不同的是響應(yīng)值多出了 3 個(gè)Set-Cookie字段。下面有一個(gè)Set-Cookie顯示為session=eyJhIjoiMSIsImIiOiIyIn0.EWX6Qg.M8tEGPyRhlf0iUiLktEqup-4e-U; HttpOnly; Path=/,由此可見 session 一般是加密串格式,可以通過 cookie 傳遞。

token 演示

token 的使用有一個(gè)非常經(jīng)典的場景,就是在 github 中的使用。在 github->settings->Developer settings->Personal access tokens 中,可以生成一個(gè) token 用于訪問 github 的 api,這個(gè) token 是沒有時(shí)效性的,“任何人”可以使用它們代替通過 HTTPS 的 Git 密碼,也可以用來通過基本身份驗(yàn)證向 API 進(jìn)行身份驗(yàn)證。

使用 OAuth 令牌對 GitHub API 進(jìn)行身份驗(yàn)證(因返回結(jié)果個(gè)人信息太多所以省略展示)

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


session、cookie、token 的區(qū)別

@startuml

autonumber

title session、cookie過程

participant 客戶端 as c

participant 服務(wù)器 as s


c -> s: 第一次請求

s -> s: 創(chuàng)建SessionID并保存

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

c -> c: Cookie保存\n在瀏覽器

c -> s: 第二次請求,請求中攜帶Cookie和SessionId

s -> s: 判斷SessionId\n屬于哪個(gè)用戶

s -> c: 響應(yīng)?


@enduml

@startuml

autonumber

title token身份驗(yàn)證流程


participant 客戶端 as c

participant 服務(wù)器 as s


c -> s: 第一次請求,攜帶用戶信息(賬戶、密碼)

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

s -> c: 返回token

c -> s: 請求時(shí)攜帶token

s -> s: 對token解密之后做認(rèn)證

s -> c: 響應(yīng)?


@enduml

  • session 存儲(chǔ)在服務(wù)器端,cookie 存儲(chǔ)在客戶端。

  • cookie 可設(shè)置為長時(shí)間保持,session 一般失效時(shí)間較短,客戶端關(guān)閉(默認(rèn)情況下)或者 session 超時(shí)都會(huì)失效。

  • session記錄會(huì)話信息,token不會(huì)記錄會(huì)話信息。token是無狀態(tài)的。



接口測試經(jīng)典面試題:Session、cookie、token有什么區(qū)別?的評(píng)論 (共 條)

分享到微博請遵守國家法律
台南市| 沾益县| 石门县| 成安县| 横峰县| 罗定市| 惠东县| 弋阳县| 嘉义县| 郧西县| 南平市| 湖南省| 莱阳市| 来凤县| 宜兴市| 泗水县| 石楼县| 肇庆市| 张家港市| 新干县| 沂水县| 磐石市| 桓仁| 西峡县| 侯马市| 德格县| 五大连池市| 新闻| 嘉禾县| 米泉市| 金溪县| 余江县| 庄河市| 汕头市| 司法| 怀宁县| 临漳县| 正定县| 姜堰市| 托里县| 巴彦县|