首页 > 其他分享 >接口测试经典面试题:Session、cookie、token有什么区别?

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

时间:2022-08-15 12:02:24浏览次数:92  
标签:面试题 请求 Session token session Cookie cookie 客户端

原文链接

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():
    #收到请求后写入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

分析 session、cookie、token

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是无状态的。

获取更多相关资料,请添加微信ceshiren001

标签:面试题,请求,Session,token,session,Cookie,cookie,客户端
From: https://www.cnblogs.com/chengzi-ceba/p/16587784.html

相关文章

  • 会话技术_session_细节1和会话技术_session_细节2
    当客户端关闭后,服务器不关闭,两次获取Session是否为同一个默认情况下,不是如果相同,则可以创建Cookie,键为JESSIONID,设置最大存活时间,让cookie持久化保存......
  • 【java面试题】ArrayList和LinkedList的区别
    【java面试题】ArrayList和LinkedList的区别 ArrayList和LinkedList都实现了List接口,它们有一下的不同点:ArrayList是基于索引的数据接口,它的底层是数组,它可以以O(1)时......
  • session的特点以及验证码案例的需求和分析
    session的特点1、session用于存储一次会话的多次请求的数据,存在服务器端2、session可以存储任意类型,任意大小的数据session和Cookie的区别:1、session存储......
  • Session实现验证码
    验证码需求:1.访问带有验证码的登录页面login.jsp2.用户输入用户名,密码以及验证码如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误如果验证码输入......
  • Session原理分析以及Session的细节
    Session原理分析session的实现是依赖于cookie的当客户端第一次请求会话对象时,服务器会创建一个Session对象,并为该Session对象分配一个唯一的SessionID(用来标识这......
  • 【java面试题】面向对象的特征
    【java面试题】面向对象的特征 面向对象编程是利用类和对象编程的一种思想,万物可归类,类是对于世界事物的高度抽象,万物皆对象,对象是具体的世界事物。面向对象的三大特征......
  • 会话技术Session_细节和特点
    细节:1.当客户端关闭后,服务器不关闭,两次获取Session是否为同一个?  1.默认情况下不是把浏览器关闭后在访问session的地址值不一样了   如果需要相同,则可以创建......
  • 戏开发程序岗面试题答案版(一)-- C++篇
     游戏开发程序岗面试题答案版C++篇, 后续继续更新游戏逻辑篇、unity篇、图形学篇,并整理成文档,可在公号【游戏君五尘】获取。 网页排版排版较乱,原文链接游戏开......
  • 自定义注解进行token校验(转载)
    (18条消息)SpringBoot自定义注解实现Token校验_李秀才的博客-CSDN博客_springboot校验token......
  • session与cookie
    一,什么是Session1.   session 代表服务器与浏览器的一次会话;2.  session  是一种服务器端的机制,session对象用来储存特性用户会话所需要的信息;3.  sessi......