Web 应用最安全的会话实现和保持方式是什么?

目录

什么是会话管理

保障会话安全的关键

Set-Cookie header 头

基于 Set-Cookie 实现会话管理示例


什么是会话管理

什么是会话管理?

会话管理是一种在无状态的 HTTP 协议上保持用户状态的技术, Web 服务器通过会话管理可以识别和跟踪用户的请求。

为什么需要会话管理?

由于 HTTP 协议本身不保存状态信息,所以服务器需要一种机制来区分不同用户的请求,以及在多个请求之间保持用户的状态信息。

会话创建

会话信息应该由服务器端创建,服务器端创建会话 ID 以及会话信息后存储起来,将会话 ID 返回给 Web 客户端存储。会话 ID应 该是随机的、不可预测的,并且有足够的熵。会话 ID 通常是通过安全的随机数生成算法生成。客户端和服务器通信的时候带上会话 ID,这样服务器就可以识别和跟踪用户的请求了。

文章持续更新中,微信搜索【路多辛】优质文章

保障会话安全的关键

可以看出会话管理安全的关键主要在于两个点:

  • 客户端和服务端需要安全通信, 以保障会话 ID 的传输安全;
  • Web 端需要做安全存储会话 ID,不能被 JS 脚本任意读取,以防止 CSS 攻击。

针对第一点,可以使用 HTTPS 协议来解决。针对第二点,可以使用 Set-Cookie 机制来解决。

Set-Cookie 是 HTTP 协议的一个 header 字段,由服务器端返回给客户端(通常是浏览器),用于在客户端创建一个 cookie。Cookie 通常用于保存用户会话信息。Set-Cookie 的工作机制如下:

  1. 服务器响应设置 Cookie:
    当服务器希望在客户端设置一个 cookie 时,在 HTTP 响应中包含一个 Set-Cookie header 头,包含 cookie 的名称、值以及一些可选的属性,比如 Expires、Max-Age、Domain、Path、Secure 和 HttpOnly 等。
  2. 客户端存储 Cookie:
    浏览器接收到 Set-Cookie header 头后,会根据服务器指定的属性存储这个 cookie。如果设置了 Expires 或 Max-Age 属性,浏览器会根据这些值决定 cookie 的有效期。如果没有设置这些属性,cookie 通常为会话 cookie,意味着当浏览器关闭时 cookie 会被删除。
  3. 客户端发送 Cookie:
    一旦 cookie 被存储,浏览器会在随后对同一服务器的每个请求中自动包含这个 cookie,前提是这些请求匹配了 cookie 的 Domain 和 Path 属性。
  4. 服务器读取 Cookie:
    服务器可以通过读取请求中的 Cookie header 头来获取之前设置的 cookie 信息。这样服务器就可以恢复用户的会话状态,如登录信息、用户偏好设置等。

Set-Cookie header 头

Set-Cookie 的值一般包含以下几个部分:

  • name=value:指定 cookie 的名称和值。
  • Expires:定义了 cookie 的过期时间,是一个具体的日期和时间。在这之后,cookie 将不再被存储或发送。如果没有设置 Expires,cookie 将是一个会话 cookie,意味着将在浏览器关闭时被删除。
  • Max-Age:指定从当前时间开始,cookie 存活的秒数。如果同时指定了 Expires 和 Max-Age,Max-Age 的优先级更高。
  • Domain:指定哪些域名可以接收 cookie。如果未指定,默认为当前文档的域名。如果指定了 Domain,那么子域名也会包含这个 cookie。
  • Path:指定了 cookie 的适用路径。只有请求的路径与此匹配时,cookie 才会被发送。
  • Secure:这个指令告诉浏览器只在 HTTPS 连接时发送 cookie。
  • HttpOnly:限制 JavaScript 通过 Document.cookie API 访问 cookie,有助于减少跨站脚本攻击(XSS)的风险。
  • SameSite:限制第三方请求中 Cookie 的发送。SameSite 可以设置为以下几个值:
  • Strict: Cookie 只会在请求是从同一站点发起的时候发送。
  • Lax: Cookie 对于导航到目标网站的 GET 请求会被发送,例如用户通过链接导航到网站。
  • None: 只有在设置了 Secure 属性的情况下,Cookie 才会在所有请求中被发送,包括跨站点请求。

一个典型的 Set-Cookie 信息例子:

Set-Cookie: name=value; Path=/; Domain=xx.com; Max-Age=3600; Secure; HttpOnly

基于 Set-Cookie 实现会话管理示例

原理如如下:

实现示意图

HTML 示例代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Set Cookie Example</title>
</head>
<body>
<form action="/submit" method="post"><label for="username">账号:</label><input type="text" id="username" name="username"><label for="password">密码:</label><input type="text" id="password" name="password"><input type="submit">
</form>
</body>
</html>

Golang 示例代码如下:

package mainimport ("fmt""net/http""time"
)// 处理根路径的请求,返回 HTML 页面
func rootHandler(w http.ResponseWriter, r *http.Request) {http.ServeFile(w, r, "index.html")
}// 处理表单提交,设置 cookie
func submitHandler(w http.ResponseWriter, r *http.Request) {if r.Method == "POST" {// 解析表单数据if err := r.ParseForm(); err != nil {http.Error(w, "Error parsing the form", http.StatusBadRequest)return}// 获取表单中的 sessionId 值username := r.FormValue("username")password := r.FormValue("password")fmt.Println(username, password)//校验账号密码,本例为举例目的省略此逻辑// 创建一个 cookieexpirationTime := time.Now().Add(1 * time.Hour) // 设置 cookie 有效期为 1 小时cookie := http.Cookie{Name:     "token",Value:    "xxxxxx", //此处先写死方便举例,自己实现千万不要写死Expires:  expirationTime,Path:     "/",HttpOnly: true, // 设置 HttpOnly 标志}// 将 cookie 添加到响应中http.SetCookie(w, &cookie)// 重定向到根路径,或者显示一些消息http.Redirect(w, r, "/", http.StatusFound)}
}func main() {http.HandleFunc("/", rootHandler)http.HandleFunc("/submit", submitHandler)// 启动 HTTP 服务器http.ListenAndServe(":8080", nil)
}

文章持续更新中,微信搜索【路多辛】优质文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/637089.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win32-显示窗口、消息循环、消息队列

承接上文&#xff1a; win32窗口编程windows 开发基础win32-注册窗口类、创建窗口 本文目录 显示窗口 ShowWindow function (winuser.h)消息循环消息基础MSG 结构体的定义 MSG structure (winuser.h)POINT structure 结构体 (windef.h)DispatchMessage() 如何将消息派发给窗口…

XS9922驱动

XS9922B 是一款四通道多合一模拟高清解码器&#xff0c;支持HDcctv高清协议和CVBS标清协议。它最大支持1080p 30fps的视频分辨率&#xff0c;具有以下亮点&#xff1a; 四通道视频输入MIPI CSI-2 4-Lane视频输出支持音频传输封装&#xff1a;QFN88&#xff0c;尺寸为10mm x 1…

安装IntelliJ IDEA

文章目录 一、前言二、下载IDEA三、安装四、破解 一、前言 工欲善其事必先利其器&#xff0c;学习JAVA的第一步&#xff0c;首先是安装IDE&#xff0c;配置环境&#xff1b; 常用的JAVA IDE是IntelliJ IDEA和eclipse&#xff0c;我选择IntelliJ IDEA 二、下载IDEA 官网下载&…

MT3023 歌词中找单词

1.暴力 10/12 #include <bits/stdc.h> using namespace std; int n; string a[10005]; int main() {cin >> n;for (int i 0; i < n; i)cin >> a[i];string ll;cin >> ll;for (int i 0; i < n; i){string u a[i];int num 0;int j 0;for (in…

算法课程笔记——STL题目

长度为2的字符串&#xff0c;当in下标为一&#xff0c;也就是\n,当i&#xff01;n&#xff0c;就是输出空格 &&且 city从citys里面取 加速后就不能混用scanf

MySql运维篇

目录 一.日志 1.1日志分类 1.2Error Log 1.3BinaryLog 1.4SlowQuery Log 二.备份 2.1备份原因 2.2备份目标 2.3备份技术 2.3.1物理备份 2.3.2逻辑备份 2.4备份方式 2.4.1完全备份 2.4.2增量备份 2.4.3差异备份 2.5备份环境准备 2.6完全备份实验 2.6.1完全备…

Jenkins服务器IP更换,Jenkins URL地址更换

服务器的网络地址发生变动&#xff0c;修改jenkins服务器IP地址后&#xff0c;jenkins网页能够打开&#xff0c;但是job中的配置钩子没有自动改变&#xff0c;如图所示&#xff1a; 经过查询资料了解&#xff0c;需要修改jenkins本地化配置地址才可以显示正确&#xff1a; 1、…

上位机图像处理和嵌入式模块部署(树莓派4b和驱动的编写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 树莓派4b上面还支持驱动代码的编写&#xff0c;这是我没有想到的。这里驱动&#xff0c;更多的是一种框架的编写&#xff0c;不一定是编写真正的驱…

苹果开发初学者指南:Xcode 如何为运行的 App 添加环境变量(Environmental Variable)

概览 Xcode 15 在运行 SwiftUI 代码时突然报告如下警告&#xff1a; Error: this application, or a library it uses, has passed an invalid numeric value (NaN, or not-a-number) to CoreGraphics API and this value is being ignored. Please fix this problem. 不仅如此…

scratch图章画图 2024年3月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析

目录 scratch图章画图 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、p…

mysql基础14——视图

视图 视图是一种虚拟表 可以把一段查询语句作为视图存储在数据库中 需要的时候把视图看作一个表&#xff0c;对里面的数据进行查询 视图并没有真正存储数据 避免了数据存储过程中可能产生的冗余 提高了存储的效率 子查询 嵌套在另一个查询中的查询 派生表 如果在查询中…

【linux】基础IO(软硬链接)

上一节我们已经搞懂了已经被打开的文件&#xff0c;还有没有被打开的文件都是怎样被管理起来的&#xff0c;同样&#xff0c;路径的重要性也不言而喻&#xff0c;是确定文件在那个分区&#xff0c;进而可以解析到目标文件与目录内容的关系&#xff0c;从而找到inode&#xff0c…