登陆鉴权
登录鉴权¶
Cookies¶
Cookie,是一个客户端会话技术,是服务器委托浏览器在客户端存储少量关键数据的方式
Cookie由服务端创建,放在响应头发送给客户端保存,通常记录用户识别信息
Cookie因为存放在客户端,容易被编造伪造,一般不用于存储重要信息
Cookie分为两种:
-
持久性(permanent cookie):具有Expires/Max-Age属性来控制何时过期,能在浏览器关闭后存储
-
会话(session)cookie:在会话期间有效,当浏览器被关闭就会失效
常用目的¶
-
会话管理:
例如,用户登录后,Cookie 可以用于维持用户的会话状态,避免每次请求都需要重新登录。
-
个性化设置:
存储用户的首选项和设置,如语言偏好、主题颜色等。
- 追踪和分析:
用于跟踪用户行为,收集统计数据,以便网站改进和广告投放。
组成¶
一个完整的 Cookie 包含多个属性和字段,具体如下:
- 名称(Name):Cookie 的键,用于标识 Cookie。
- 值(Value):Cookie 的值,与名称一起存储实际数据。(与名称用等号连接)
- 域(Domain):指定 Cookie 所属的域名(默认匹配子域名),控制 Cookie 的发送范围。
- 路径(Path):指定 Cookie 的有效路径(可匹配子路径),只有在请求 URL 与路径匹配时才会发送 Cookie。
- 到期时间/最大存活时间(Expires/Max-Age):
Expires:指定 Cookie 的过期时间,是一个具体的日期时间。Max-Age:指定 Cookie 的存活时间,以秒为单位。(优先级高)- 该参数针对于持久性Cookie,若缺失则视为会话cookie
- 安全标志(Secure):指定 Cookie 只能通过 HTTPS 连接发送,确保数据传输的安全性。
- HttpOnly 标志:指定 Cookie 只能通过 HTTP/HTTPS 协议访问,JavaScript 无法读取。
- 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授权流程
- 应用向授权中心发送请求
- 授权中心引导用户在其网站上登陆鉴权
- 登录后,授权中心带着授权信息,重定向到我们的应用地址