跳转至

登陆鉴权

登录鉴权

Cookies

Cookie,是一个客户端会话技术,是服务器委托浏览器在客户端存储少量关键数据的方式

Cookie由服务端创建,放在响应头发送给客户端保存,通常记录用户识别信息

Cookie因为存放在客户端,容易被编造伪造,一般不用于存储重要信息

Cookie分为两种:

  • 持久性(permanent cookie):具有Expires/Max-Age属性来控制何时过期,能在浏览器关闭后存储

  • 会话(session)cookie:在会话期间有效,当浏览器被关闭就会失效

常用目的

  • 会话管理:

    例如,用户登录后,Cookie 可以用于维持用户的会话状态,避免每次请求都需要重新登录。

  • 个性化设置:

​ 存储用户的首选项和设置,如语言偏好、主题颜色等。

  • 追踪和分析:

​ 用于跟踪用户行为,收集统计数据,以便网站改进和广告投放。

组成

一个完整的 Cookie 包含多个属性和字段,具体如下:

  1. 名称(Name):Cookie 的键,用于标识 Cookie。
  2. 值(Value):Cookie 的值,与名称一起存储实际数据。(与名称用等号连接)
  3. 域(Domain):指定 Cookie 所属的域名(默认匹配子域名),控制 Cookie 的发送范围。
  4. 路径(Path):指定 Cookie 的有效路径(可匹配子路径),只有在请求 URL 与路径匹配时才会发送 Cookie。
  5. 到期时间/最大存活时间(Expires/Max-Age):
    • Expires:指定 Cookie 的过期时间,是一个具体的日期时间。
    • Max-Age:指定 Cookie 的存活时间,以秒为单位。(优先级高)
    • 该参数针对于持久性Cookie,若缺失则视为会话cookie
  6. 安全标志(Secure):指定 Cookie 只能通过 HTTPS 连接发送,确保数据传输的安全性。
  7. HttpOnly 标志:指定 Cookie 只能通过 HTTP/HTTPS 协议访问,JavaScript 无法读取。
  8. SameSite 属性:
    • Strict:严格模式,Cookie 只能在同站请求时发送。
    • Lax:宽松模式,部分跨站请求(如GET)可以发送 Cookie。
    • None:不限制,允许跨站请求发送 Cookie(需要 Secure 标志)。
Set-Cookie: sessionId=abc123; Path=/; Domain=example.com; Expires=Wed, 09 Jun 2024 10:18:14 GMT; Secure; HttpOnly; SameSite=Strict

优缺点

优点:

  • 状态保持:允许服务器在无状态的 HTTP 协议中保持用户的状态信息,避免重复登录
  • 个性化:Cookie 可以存储用户的首选项和设置,提供个性化体验
  • 可用性:大多数编程语言和框架都提供了内置的支持,也被浏览器原生支持

缺点:

  • 存储限制:

    浏览器对每个域名的 Cookie 数量和总大小有限制,无法存储大量数据

    通常,每个 Cookie 最大为 4KB,每个域名最多存储 20-50 个 Cookie。

  • 安全隐患:

    Cookie 存储在客户端,容易受到攻击,如跨站脚本(XSS)和跨站请求伪造(CSRF)。

    攻击者可以利用这些漏洞窃取或篡改 Cookie 数据。

    并且Cookie 数据存储在客户端,这意味着数据的完整性和真实性无法得到完全保证。

跨域资源共享CORS

浏览器的内置资源,如cookie等,让任意网站访问是很危险的

CORS可以限定一个请求的来源和访问资源,来应对这样的问题

实现流程

CORS是origin级别的请求限制,本质上是基于请求header进行约定限制

按照是否有副作用,CORS将请求分为non-simple/simple request

对于non-simple request,浏览器会先发送OPTION请求进行验证

OPTIONS /data HTTP/1.1
...
Origin: http://example-client.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type

其中告知了后续请求的域来源、方法、和头字段

随后服务器会发回字段,来告知发送方自己接受的请求类型

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: http://example-client.com #域来源限制
Access-Control-Allow-Credentials: true #是否接受cookie
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Max-Age: 86400 #OPTION缓存

随后如果满足要求,浏览器会继续发送正式请求,并携带域名

服务器在正常响应时也会添加上述字段,帮助浏览器持续校验

对于simple request,只需要采用上述两行操作即可

具体使用

本质上来讲,CORS的限制是由请求方实现的

对于浏览器,CORS限制是基于其提供的API实现的(如FetchAPI)

反过来说,通过不使用这些API,可以绕过CORS的限制,如src属性请求

对于服务器,CORS协议只需要配置Header字段,因此可以放在路由部分实现

鉴权实现

通过HTTPS协议,我们基本可以保证信息传输的安全

但多次请求中,如果进行反复的鉴权会造成时间上的低效和安全隐患

因此我们会采用一次鉴权+状态保持的方法,便利化权限验证

一般采用的方法有token、oauth

Token

Token的鉴权信息存储在客户端

一般流程如下:

  • 用户登录后,服务端生成一个代表身份的令牌,并返还给客户端
  • 客户端进行本地存储,后续通过携带该token来证明身份
  • 一定时期后,服务端可以对token进行过期处理,提高安全性

最简单的Token实现是Session,即通过session ID来实现鉴权

另外一种方法是JWT,它的token中携带了用户信息,减少了服务端的查找的消耗

但JWT是无状态的,因而无法进行强制注销

OAuth

OAuth(Open Authorization)是一个开放的标准授权协议

它允许用户在不透露账户密码的情况下,授权第三方应用访问他们在某个服务提供商上的资源

一般OAuth授权流程

  • 应用向授权中心发送请求
  • 授权中心引导用户在其网站上登陆鉴权
  • 登录后,授权中心带着授权信息,重定向到我们的应用地址