赞
踩
目录
什么是会话管理?
会话管理是一种在无状态的 HTTP 协议上保持用户状态的技术, Web 服务器通过会话管理可以识别和跟踪用户的请求。
为什么需要会话管理?
由于 HTTP 协议本身不保存状态信息,所以服务器需要一种机制来区分不同用户的请求,以及在多个请求之间保持用户的状态信息。
会话创建
会话信息应该由服务器端创建,服务器端创建会话 ID 以及会话信息后存储起来,将会话 ID 返回给 Web 客户端存储。会话 ID应 该是随机的、不可预测的,并且有足够的熵。会话 ID 通常是通过安全的随机数生成算法生成。客户端和服务器通信的时候带上会话 ID,这样服务器就可以识别和跟踪用户的请求了。
文章持续更新中,微信搜索【路多辛】阅读更多优质文章
可以看出会话管理安全的关键主要在于两个点:
针对第一点,可以使用 HTTPS 协议来解决。针对第二点,可以使用 Set-Cookie 机制来解决。
Set-Cookie 是 HTTP 协议的一个 header 字段,由服务器端返回给客户端(通常是浏览器),用于在客户端创建一个 cookie。Cookie 通常用于保存用户会话信息。Set-Cookie 的工作机制如下:
Set-Cookie 的值一般包含以下几个部分:
一个典型的 Set-Cookie 信息例子:
Set-Cookie: name=value; Path=/; Domain=xx.com; Max-Age=3600; Secure; HttpOnly
原理如如下:
实现示意图
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 main
-
- import (
- "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)
-
- //校验账号密码,本例为举例目的省略此逻辑
-
- // 创建一个 cookie
- expirationTime := 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)
- }
文章持续更新中,微信搜索【路多辛】阅读更多优质文章
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。