http头部字段cookie

发布时间 2023-04-18 18:03:28作者: 挖洞404

1、cookie

(1)介绍

http是无状态的,即两次http请求之间无法区分。cookie是一种数据结构,一般由服务端创建,通过响应set-cookie字段交给浏览器,浏览器将其保存到本地的文本文件中,然后在请求时读取携带cookie.

当然,js也可以创建cookie,读取和操作cookie。

(2)属性

name:cookie的名称

value:cookie的值

domain:作用的域名范围,在对应域名及子域名的请求时,携带cookie

path:作用的路径范围,在对应路径及子路径的请求时,携带cookie

expires:过期后,浏览器自动删除该cookie

HttpOnly:具有该标志的cookie只能由请求携带,而不能被js读取

Secure:具有该标志的cookie只能由https请求携带,而http无法携带

(3)Set-Cookie

向浏览器设置服务端创建的cookie,一个cookie对应一个Set-Cookie字段,一个响应中可以同时有多个Set-Cookie字段。

set-cookie: test_cookie=CheckForPermission; expires=Thu, 20-Oct-2022 06:51:46 GMT; path=/; domain=.doubleclick.net; Secure; HttpOnly; SameSite=none
set-cookie: test_cookie=CheckForPermission; expires=Thu, 20-Oct-2022 06:51:46 GMT; path=/; domain=.doubleclick.net; Secure; SameSite=none

(4)浏览器存储

所有浏览器都支持查看保存的cookie,F12》应用程序》选择cookie,并且可以直接进行操作。

(5)Cookie

向服务端表示符合的cookie。

只有满足各属性完全符合才会携带,在请求中只有一个Cookie字段,多个cookie之间用;分割,cookie只携带name和value属性,用=连接。

Cookie: wordpress=rofdd; wp-settings-time-1=16662dd; wp-settings-1=abc

2、session

session机制是服务器将需要在不同请求间沟通的数据保存在服务端,这块内容称为session,而仅仅将session的id返回给浏览器,浏览器下次请求时携带id,服务端在其本地进行读取解析。

比较:

  • 信息存储在客户端,有危险。而session的信息存储在服务端
  • cookie有大小限制,而session由于信息在服务端没有传输大小限制
  • cookie低效,session因为传输数据小所以高效
  • 当然,session在服务端会占用服务器的资源,数据过多也会导致问题

session id本质上依据是基于cookie进行传输的。一般,在访问网站的第一时间,服务器容器会默认的设置session,该session设为会话类型,带有httponly标志,不同容器的session的名称可能不同。

SESSIONID=mD3cHY2uPhvcrGDwnYL1gxPu7FAWTFH64dHVpkPivuV
PHPSESSID=4680c9df2ce9ac4d1aa7f366bd92d83a

3、token

cookie机制只能在同域或者子域进行携带,session属于cookie。而对于某些站点来说,可能具有多个互不兼容的域名,这时无法利用cookie作为登录凭证。

一个思路是设置cookie匹配多个域,但是这是跨域设置cookie,极有可能干扰其他站点,造成危害或者影响正常业务。

解决方法是放弃cookie,在请求时手动添加登录凭证。这个cookie之外的登录凭证称为token,实质是一段在登录成功后的验证文本。在之后的每次需要验证身份的请求时,携带该文本。

场景1:前后端不分离,服务端直接为响应中的html或者动态文件中的url添加token参数

场景2:前后端分离,前端ajax发起请求时,js将token拼接到url中,或者设置为头部字段,或者在请求体部中

需要注意,token的强度,以及不能直接在响应中直接在cookie中设置。

token除了实现跨域的登录状态验证,还可以在每次响应时重新设置token,实现防止csrf和表单重复提交功能。