当前位置: 首页 > news >正文

cookies,session,token都是相对安全,并不能完全防窃取

文章目录

  • 1、cookies的属性
    • 从浏览器上可以看到cookies的属性有这些
    • Name和Value
    • Domain
    • Path
    • Expires/Max-age
    • Size
    • HttpOnly
    • Secure
    • SameSite
    • Priority
  • 2、cookie发送的过程
  • 3、Cookie 主要使用在以下场景
  • 4、session
    • Session常用属性有:
    • Session常用方法有:
    • session的优缺点:
    • 为什么session比cookies安全?
  • 5、token
  • 参考文档

1、cookies的属性

从浏览器上可以看到cookies的属性有这些

在这里插入图片描述

Name和Value

Name和Value是一个键值对。Name是Cookie的名称,Cookie一旦创建,名称便不可更改,一般名称不区分大小写;Value是该名称对应的Cookie的值,如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码。

Domain

Domain决定Cookie在哪个域是有效的,也就是决定在向该域发送请求时是否携带此Cookie,Domain的设置是对子域生效的,如Doamin设置为 .a.com,则b.a.com和c.a.com均可使用该Cookie,但如果设置为b.a.com,则c.a.com不可使用该Cookie。Domain参数必须以点(“.”)开始。

Path

Path是Cookie的有效路径,和Domain类似,也对子路径生效,如Cookie1和Cookie2的Domain均为a.com,但Path不同,Cookie1的Path为 /b/,而Cookie的Path为 /b/c/,则在a.com/b页面时只可以访问Cookie1,在a.com/b/c页面时,可访问Cookie1和Cookie2。Path属性需删除线格式 要使用符号“/”结尾。

Expires/Max-age

Expires和Max-age均为Cookie的有效期,Expires是该Cookie被删除时的时间戳,格式为GMT,若设置为以前的时间,则该Cookie立刻被删除,并且该时间戳是服务器时间,不是本地时间!若不设置则默认页面关闭时删除该Cookie。
Max-age也是Cookie的有效期,但它的单位为秒,即多少秒之后失效,若Max-age设置为0,则立刻失效,设置为负数,则在页面关闭时失效。Max-age默认为 -1。

Size

Szie是此Cookie的大小。在所有浏览器中,任何cookie大小超过限制都被忽略,且永远不会被设置。各个浏览器对Cookie的最大值和最大数目有不同的限制,整理为下表(数据来源网络,未测试):

浏览器Cookie最大条数Cookie最大长度/单位:字节
IE504095
Chrome1504096
FireFox504097
Opera304096
Safari无限4097

HttpOnly

HttpOnly值为 true 或 false,若设置为true,则不允许通过脚本document.cookie去更改这个值,同样这个值在document.cookie中也不可见,但在发送请求时依旧会携带此Cookie。

Secure

Secure为Cookie的安全属性,若设置为true,则浏览器只会在HTTPS和SSL等安全协议中传输此Cookie,不会在不安全的HTTP协议中传输此Cookie。

SameSite

SameSite用来限制第三方 Cookie,从而减少安全风险。它有3个属性,分别是:

  • Strict
    Scrict最为严格,完全禁止第三方Cookie,跨站点时,任何情况下都不会发送Cookie
  • Lax
    Lax规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。
  • None
    网站可以选择显式关闭SameSite属性,将其设为None。不过,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。

Priority

优先级,chrome的提案,定义了三种优先级,Low/Medium/High,当cookie数量超出时,低优先级的cookie会被优先清除。
在360极速浏览器和FireFox中,不存在Priority属性,不清楚在此类浏览器中设置该属性后是否生效。

2、cookie发送的过程

  • 如果客户端上,一个网站有10个cookie,它将会把10个cookie的名称和值,通过“=”和“;”连接形成一个字符串,接着把这个字符串放于请求头cookies字段中。客户端发送请求的时候会将本地当前网址的cookie一次性全部生成一条字符串,然后通过请求头上传给服务器。
  • 例如下图
    在这里插入图片描述
    生成的cookies为:sex=nan;name=beifeng;age=12 这种字符串

3、Cookie 主要使用在以下场景

会话状态管理(如用户登录状态、及其他需要记录的信息)
个性化设置(如用户自定义设置)
浏览器追踪行为(如追踪分析用户行为)

4、session

Session常用属性有:

(1)SessionID:获取Session编号,一般在会话开始的时候由服务器自动分配一个标识SessionId,整个会话过程中的SessionId保持不变。

(2)TimeOut:设置Session对象的超期时间,默认为20分钟。

(3)Keys:根据索引号获取Session变量值

(4)Count:获取Session变量的总数量。

Session常用方法有:

  • Session.Add(“name”,“value”):添加名称为Name,值为value的Session对象。

  • Session.Clear():清除Session变量值。

session的优缺点:

  • 缺点
    需要从内存或者数据库里面取数据,进行验证,相对jwt来说更耗时。
    扩展性差,对于分布式应用,需要实现session数据共享。比如,当使用分布式的情况下,可能由于负载均衡的策略,导致访问到了不同的服务器,所以得让用户登录时的seesion状态要共享到其他服务器(其数据库)上。
  • 优点
    安全,数据存储在服务器端
    相对于jwt来说,用来传输用户信息的网络流量更少
    相对于jwt来说,适合做会话管理,单点登录。

为什么session比cookies安全?

  • 因为session使用过程中,session是把全部信息存储于服务器,客户端只有一个sessionId。而cookies是把所有信息存储于客户端。对于同一个账户而言,cookies有几率可以篡改账户信息,但是session无法篡改用户信息。就如同银行卡(session)比现金(coookies)安全,现金别人捡到了能尝试篡改金额,但是银行卡只有 卡号,不可能篡改金额。

5、token

  1. 客户端使用用户名跟密码请求登录

  2. 服务端收到请求,去验证用户名与密码

  3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端

  4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里

  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token

  6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。

  • 举个token的例子
eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ3YW5nIiwiY3JlYXRlZCI6MTQ4OTA3OTk4MTM5MywiZXhwIjoxNDg5Njg0NzgxfQ.RC-BYCe_UZ2URtWddUpWXIp4NMsoeq2O6UF-8tVplqXY1-CI9u1-a-9DAAJGfNWkHE81mpnR3gXzfrBAB3WUAg
  • token分成了三部分,每部分用 . 分隔,每段都是用 Base64 编码的。强调Base64并不是加密方式,等同于明文。
  • 第一部分Header(头部)一般存储tokne类型和加密算法
  • 第二部分是Playload(有效载荷),存储用户信息,因为是明文存储,所以不能存储用户重要的信息,一般会存储uuid(只是其中一个数据)。
  • 第三部分是签名,加密后生成的,密文再用Base64编码。签名是为了防篡改有效载荷,判断token是否合法。

参考文档

  • Cookie的所有属性详解
  • 详解Cookie、Session与Token
  • 深入理解有状态和无状态以及JWT和Session
  • Token的组成部分

相关文章:

  • 在Ubuntu22.04条件下,如何打开树莓派4B的串口
  • 初识Docker
  • PMP每日一练 | 考试不迷路-10.29(包含敏捷+多选)
  • SSL证书验证原理和https加密
  • Python实现秒杀抢购某宝商品,不再害怕双十一抢不到了
  • 瞪羚优化算法(Gazelle Optimization Algorithm,GOA)
  • CSS3入门
  • 【SQL优化】海量数据大页码MySQL查询该如何优化
  • 乐吾乐le5le-Topology为智慧水务可视化赋能(一)
  • 【node进阶】深入浅出---MVC设计模式RESTful风格
  • java计算机毕业设计基于精细化考核的离散数学课程教学目标达成系统源码+系统+数据库+lw文档
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • 刚入职如何快速熟悉需求并输出测试用例?
  • R语言和医学统计学(5):多因素方差分析
  • Python采集某网站小视频内容, m3u8内容下载
  • (三)从jvm层面了解线程的启动和停止
  • .pyc 想到的一些问题
  • [译]前端离线指南(上)
  • 《Java编程思想》读书笔记-对象导论
  • HashMap剖析之内部结构
  • Hibernate最全面试题
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java面向对象及其三大特征
  • MySQL QA
  • PHP面试之三:MySQL数据库
  • Python爬虫--- 1.3 BS4库的解析器
  • Spring核心 Bean的高级装配
  • vue-router的history模式发布配置
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 读懂package.json -- 依赖管理
  • 今年的LC3大会没了?
  • 来,膜拜下android roadmap,强大的执行力
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 小试R空间处理新库sf
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • ​​​​​​​​​​​​​​Γ函数
  • #include
  • (C++17) optional的使用
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)关于pipe()的详细解析
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET BackgroundWorker
  • .net core Swagger 过滤部分Api
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • .py文件应该怎样打开?
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • [20171101]rman to destination.txt
  • [Android]How to use FFmpeg to decode Android f...