一、B站的登录和未登录——一种登录场景的演示
我们现在上的是B站大学,所以对于B站,我们是很熟悉的。当我们打开浏览器,并访问B站网页时(很熟悉),会发现我们会自动登录上B站,为什么呢??因为在浏览器中,浏览器会有一个Cookie和站点数据,当我们将这些Cookie和站点数据删除以后,再次刷新网站,我们会发现现在我们处于未登录状态。
我们来思考两个问题:B站是如何认识我这个登录用户的??HTTP是无状态,无连接的,怎么能够记住我呢??
B站是通过我们发送的请求中的字段进行校验,检验成功后,就可以登录成功。
我们在使用HTTP协议请求网页时,我们会使用GET或者POST方法进行提交参数,服务器会收到数据并检验数据是否正确,然后返回响应,在响应中设置Set-Value字段,在浏览器中收到该响应后,我们会将提交的参数在每次请求网页时都带上该数据,那么服务器每次就可以检验请求,验证成功就登录成功了。
二、引入 HTTP Cookie
2.1 定义
HTTP Cookie(也称为Web Cookie,浏览器Cookie或者简称为Cookie)是服务器发送到用户浏览器并保存在浏览器上的一小块数据,它会在浏览器之后向同一服务器再次发起请求时被携带并发送到服务器上。通常,它用于告知服务器两个请求是否来自同一个浏览器,如保持用户的登录状态。记录用户偏好等。一般分为内存级和文件级Cookie。
2.2 工作原理
- 当用户第一次访问到网站时,服务器会在响应的HTTP报头中设置Set-Cookie字段,用于发送Cookie到用户的浏览器。
- 浏览器在接收到Cookie后,会将其保存在本地(通常是按照域名进行存储)。
- 在之后的请求中,浏览器会自动在HTTP请求头中携带Cookie字段,将之前保存的Cookie信息发送给服务器。
2.3 分类
在定义中,我们可以知道Cookie一般分为内存级和文件级Cookie,所以Cookie分为两类:会话Cookie和持久Cookie。
- 会话Cookie(Session Cookie):在浏览器关闭时失效
- 持久Cookie(Persistent Cookie):带有明确的过期日期或持续时间,可以跨多个浏览器会话存在
- 如果Cookie是一个持久性的cookie,那么他其实就是浏览器相关的特定目录下的一个文件。但是直接查看这些文件可能会看到乱码或者无法读取的内容,因为cookie文件通常以二进制或者sqlite格式存储。一般我们查看,直接在浏览器对应的选项中直接查看即可。
2.4 安全性
由于Cookie是存储字客户端中的,因此存在被篡改或者窃取的风险。
2.5 用途
Cookie的用途有很多,对我们自身的隐私息息相关,但是由于其存储在客户端中,所以其不是很安全,我们需要重新设置一个新的东西:Session。
- 用户认证和会话管理(最重要)
- 跟踪用户行为
- 缓存用户偏好
三、认识cookie
- HTTP存在一个报头选项,Set-Cookie,可以用来进行给浏览器设置Cookie值。
- 在HTTP响应头中添加,客户端(如浏览器)获取并自行设置保存Cookie。
3.1 基本格式
Set-Cookie: <name>=<value>
其中 <name> 是 Cookie 的名称,<value> 是 Cookie 的值。
3.2 完整的Set-Cookie示例
Set-Cookie: username=peter; expires=Thu, 18 Dec 2024 12:00:00
UTC; path=/; domain=.example.com; secure; HttpOnly
时间格式必须遵守RPC 1123标准,具体格式样例:Tue,01 Jan 2030 12:34:56 GMT或者UTC(推荐)。
关于时间的解释:
- Tue: 星期二(星期几的缩写)
- ,: 逗号分隔符
- 01: 日期(两位数表示)
- Jan: 一月(月份的缩写)
- 2030: 年份(四位数)
- 12:34:56: 时间(小时、分钟、秒)
- GMT: 格林威治标准时间(时区缩写)
注意事项:
- 每一个Cookie属性都以分号(;)和空格( )分隔
- 名称和值之间使用等号(=)分隔
- 如果Cookie的名称或值包含特殊字符(比如空格,分号,逗号等),则需要进行URL编码
3.3 Cookie的声明周期
- 如果设置了expires属性,则Cookie将在指定的日期/时间后过期。
- 如果没有设置expires属性,则Cookie默认为会话Cookie,即当浏览器关闭时过期。
3.4 安全性考虑(了解即可)
- 使用secure标志可以确保Cookie仅仅在HTTPS连接上发送,从而提高安全性。
- 使用HttpOnly标志可以防止客户端脚本(如JavaScript)访问Cookie,从而防止XSS攻击。
- 通过合理设置Set-Cookie的格式和属性,可以确保Cookie的安全性、有效性和可访问性,从而满足Web应用程序的需求。
3.5 单独使用Cookie,有什么问题?
我们写入的是测试数据,如果写入的是用户的私密数据?比如,用户名密码,浏览痕迹等。本质问在于这些用户私密数据在浏览器(用户端)保存,非常容易被人盗取,更重要的是,除了被盗取,还有就是用户私密数据也就泄露了。
四、引入HTTP Session
4.1 Session的定义
HTTP Session是服务器用来跟踪用户与服务器交互期间用户状态的机制。由于HTTP协议是无状态的(每一个请求都是独立的),因此服务器需要通过Session来记住用户的信息。
4.2 Session的工作原理
- 当用户首次访问网站时,服务器会为用户创建一个唯一的Session ID,并通过Cookie将其发送到客户端中。
- 客户端在之后的请求中会携带这个Session ID,服务器通过Session ID来识别用户,从而获取用户的会话信息。
- 服务器通常会将Session信息存储在内存、数据库或缓存中。
4.3 Session的安全性
- 与Cookie相似,由于是在Session ID是在客户端和服务器之间传递的,因此也存在被窃取的风险。
- 但是一般虽然Cookie被盗取了,但是用户只泄露了一个Session ID,私密信息暂时没有被泄露的风险。
- Session ID便于服务端进行客户端有效性的管理,比如异地登录。
- 可以通过HTTPS和设置合适的Cookie属性(比如HttpOnly和Secure)来增强安全性。
4.4 超时和实效
- Session可以设置超时时间,当超过这个时间后,Session会自动失效。
- 服务器也可以主动使Session失效,例如当用户登出时。
4.5 Session的用途
- 用户认证和会话管理
- 存储用户的临时数据(比如购物车内容)
- 实现分布式系统的会话共享(通过将会话数据存储在共享数据库或缓存中)