ToB企服应用市场:ToB评测及商务社交产业平台

标题: 前端宝典十四:Node缓存、安全与鉴权 [打印本页]

作者: 商道如狼道    时间: 2024-11-21 06:24
标题: 前端宝典十四:Node缓存、安全与鉴权
本文主要从Node缓存、安全与鉴权几个方面睁开解析,包含几个方面:
一、Cookie

HTTP Cookie(通常也叫 Web Cookie 或浏览器 Cookie),是服务器发送到用户浏览器并保存在当地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。支持无状态的HTTP变为“有状态”
1、Cookie 作用:

1. 会话状态管理

如用户登录状态、购物车、游戏分数或别的需要纪录的信息
2. 个性化设置

如用户自定义设置、主题等
3. 浏览器行为跟踪

如跟踪分析用户行为等
当服务器收到 HTTP 请求时,服务器可以在响应头内里添加一个 Set-Cookie 选项。浏览器收到响应后通常会保存下 Cookie,之后对该服务器每一次请求中都通过 Cookie 请求头部将 Cookie 信息发送给服务器。
2、Set-Cookie

服务器利用 Set-Cookie 响应头部向用户代理(一样平常是浏览器)发送 Cookie 信息。一个简朴的 Cookie 大概像这样:
  1. Set-Cookie: <cookie 名>=<cookie 值>
复制代码
服务器通过该头部告知客户端保存 Cookie 信息
3、Cookie 的生命周期

Cookie 的生命周期包括:
1. 会话期 Cookie

浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有用。会话期 Cookie 不需要指定过期时间(Expires)大概有用期(Max-Age);
2. 长期性 Cookie

生命周期取决于过期时间(Expires)或有用期(Max-Age);
  1. Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
复制代码
4、如何保证Cookie安全性

1. Secure

表示只应通过被 HTTPS 协议加密过的请求发送给服务端;
2. HttpOnly

JavaScript Document.cookie API 无法访问带有 HttpOnly 属性的 cookie;此类 Cookie 仅作用于服务器。例如,长期化服务器端会话的 Cookie 不需要对 JavaScript 可用,而应具有 HttpOnly 属性。
HttpOnly 范例的 Cookie 用于制止了 JavaScript 对其的访问性而能在肯定程度上缓解XSS攻击。
3. SameSite Cookie

答应服务器要求某个 cookie 在跨站请求时不会被发送,从而可以制止(CSRF)。
SameSite 可以有下面三种值:
cookie samesite限制 strict可缓解CSRF攻击
示例:
  1. Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
  2. Secure; HttpOnly;SameSite=Strict
复制代码
二、Node缓存

1、强制缓存

当客户端请求后,会先访问缓存数据库看缓存是否存在。如果存在则直接返回,不存在则请求真的服务器。
强制缓存直接淘汰请求数,是提升最大的缓存策略。 如果考虑利用缓存来优化网页性能的话,强制缓存应该是首先被考虑的。
强制缓存不需要与服务器发生交互。

可以造成强制缓存的字段是 Cache-control 和 Expires
但是Expires设置的绝对时间,欠好用,如果客户端修改当地时间,cookie失效
全部要利用Cache-control,Cache-control这是的相对时间
// 表示有用时间为20s
  1. Cache-control: max-age=20
复制代码
cache-control设置:
2、协商缓存也叫对比缓存

当强制缓存失效(超过规定时间)时,就需要利用对比缓存,由服务器决定缓存内容是否失效。对比缓存是可以和强制缓存一起利用。
1. last-modified

缺点:
2. Etag

Etag是根据文件内容,算出一个唯一的值。服务器存储着文件的 Etag 字段。
之后的流程和 Last-Modified 一致,只是 Last-Modified 字段和它所表示的更新时间改变成了 Etag 字段和它所表示的文件 hash,把 If-Modified-Since 变成了 If-None-Match。
服务器同样进行比力,掷中返回 304, 不掷中返回新资源和 200。 Etag 的优先级高于 Last-Modified
缺点:
三、Node鉴权

现在常用的鉴权有四种:

这里主要讨论session-cookie和Token 验证
1、session-cookie

session 是缓存在服务端的,cookie 则是缓存在客户端,他们都由服务端天生,为了弥补 Http 协议无状态的缺陷。
1.session-cookie认证


2.实例:用户登录认证

利用session-cookie做登录认证时,登录时存储session,退出登录时删除session,而其他的需要登录后才气操作的接口需要提前验证是否存在session,存在才气跳转页面,不存在则回到登录页面。

  1. //前端代码
  2. async login() {
  3.   await axios.post('/login', {
  4.     username: this.username,
  5.     password: this.password
  6.   })
  7. },
  8. async logout() {
  9.   await axios.post('/logout')
  10. },
  11. async getUser() {
  12.   await axios.get('/getUser')
  13. }
复制代码
  1. //中间件 auth.js
  2. module.exports = async (ctx, next) => {
  3.   if (!ctx.session.userinfo) {
  4.     ctx.body = {
  5.       ok: 0,
  6.       message: "用户未登录" };
  7.   } else {
  8.     await next();
  9.   }
  10. };
  11. //需要验证的接口
  12. router.get('/getUser', require('auth'), async (ctx) => {
  13.   ctx.body = {
  14.     message: "获取数据成功",
  15.     userinfo: ctx.session.userinfo
  16.   }
  17. })
  18. //登录
  19. router.post('/login', async (ctx) => {
  20.   const {
  21.     body
  22.   } = ctx.request
  23.   console.log('body', body)
  24.   //设置session
  25.   ctx.session.userinfo = body.username;
  26.   ctx.body = {
  27.     message: "登录成功"
  28.   }
  29. })
  30. //登出
  31. router.post('/logout', async (ctx) => {
  32.   //设置session
  33.   delete ctx.session.userinfo
  34.   ctx.body = {
  35.     message: "登出系统"
  36.   }
  37. })
复制代码
2、Token

token 是一个令牌,浏览器第一次访问服务端时会签发一张令牌,之后浏览器每次携带这张令牌访问服务端就会认证该令牌是否有用,只要服务端可以解密该令牌,就阐明请求是合法的,令牌中包含的用户信息还可以区分差别身份的用户。一样平常 token 由用户信息、时间戳和由 hash 算法加密的签名构成。
1. Token认证流程

2. Token和session的区别

session-cookie的缺点:
3. token的缺点:

4. token与cookie的区别


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4