Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Express+FetchAPI 简单实践Cookie

Express+FetchAPI 简单实践Cookie

作者头像
赤蓝紫
发布于 2023-03-16 06:46:07
发布于 2023-03-16 06:46:07
1.4K00
代码可运行
举报
文章被收录于专栏:clzclz
运行总次数:0
代码可运行

Express+FetchAPI 简单实践Cookie

本文并不是讲解Cookie在实际项目中的应用,而只是简单地实践一下,自动保存Cookie,然后后续请求自动携带Cookie,主要是通过使用刚学到的fetch API和差不多快忘记的express来实践。

Cookie 用于在客户端存储会话信息。它通过服务器响应请求时,响应头的Set-Cookie字段来设置 Cookie。Cookie 是服务端生成,保存在客户端

这个 HTTP 响应会设置一个名为name,值为value的 Cookie。名和值在发送时都会经过 URL 编码。 浏览器会存储这些会话信息,并且之后的每个请求都会通过请求头的Cookie字段再将它们发回服务器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /index.jsl HTTP/1.1
Cookie: name=value
Other-header: other-header-value

发回给服务器的Cookie字段可用于唯一标识发送请求的客户端。

Cookie 有大小限制,一般 4K 左右。

Cookie 的构成

  • 名称(name=value):Cookie 的名称。不区分大小写,必须经过 URL 编码。
  • (name=value):Cookie 的值。必须经过 URL 编码
  • (Domain=clzczh.top):Cookie 有效的域。发送到该域名的所有请求都会包含对应的 Cookie。如果不明确设置,则默认为设置 Cookie 的域。
  • 路径(Path=/):请求 URL 中包含此路径才会携带 Cookie 发送请求。
  • 过期时间(Expires=Date):删除 Cookie 的时间戳,用于设置删除 Cookie 的时间,这个值是 GMT 格式(Wdy, DD-Mon-YYYY HH:MM:SS GMT)。当到达该时间后,就会删除 Cookie;没到达该时间时,即使关闭浏览器,Cookie 还会保留。把过期时间设置为过去的时间会立即删除 Cookie。默认只在浏览器关闭前有效
  • 安全标志(Secure):只在 HTTPS 安全连接时才可以发送 Cookie
  • 禁止 JS 读取 Cookie(HttpOnly):通过 JS 脚本无法获取 Cookie,可以有效地防止XSS攻击

Cookie 中实际发送给服务器的只有名/值对,其他部分只是告诉浏览器什么时候应该在请求中携带 Cookie 等。

Cookie 的简单实践

简单地说一下下面的代码:

  1. express 实现的后端服务
  2. 通过app.post开启 post 接口
  3. res.cookie设置 Cookie,第一个参数是 Cookie 名,第二个参数是 Cookie 值,第三个参数是 Cookie 的限制对象(如过期时间expires)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const express = require("express");
const cors = require("cors");

const app = express();

app.use(cors());

app.post("/token", function (req, res) {
  // 设置Cookie
  res.cookie("token", "123456", {
    httpOnly: true,
    expires: new Date(2030, 10, 10),
  });

  res.status(200).json({
    msg: "获取token成功",
  });
});

app.get("/getInfo", function (req, res) {
  res.json({
    msg: "成功",
  });
});

app.listen(8088, () => {
  console.log("http://localhost:8088");
});

前端试一下,能不能接收到Cookie。(使用 Fetch API,免装axios,实际使用和axios差不多,简单使用可查看之前的文章)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<body>
  <button id="btn">获取token</button>
  <button id="test-btn">测试自动携带Cookie</button>
  <script>
    const btn = document.getElementById("btn");
    btn.addEventListener("click", fetchData);

    const testBtn = document.getElementById("test-btn");
    testBtn.addEventListener("click", getInfo);

    function fetchData() {
      fetch("http://localhost:8088/token", {
        method: "post",
      }).then((res) => {
        // 获取响应的数据
        res.json().then((data) => {
          console.log(data);
        });
      });
    }

    function getInfo() {
      fetch("http://localhost:8088/getInfo").then((res) => {
        console.log(res);
      });
    }
  </script>
</body>

看似万事大吉了,实际上,还是有问题的:

Cookie压根没存到客户端。

解决方案1

使用fetch发送请求时,设置credentialsinclude(axios则是设置withCredentialstrue),这样子跨域请求时夜会发送Cookie(也可以用来保存跨域请求响应的Cookie)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fetch('http://localhost:8088/token', {
    method: 'post',
    credentials: 'include'
})

当我们设置credentialsinclude时,

  • 我们解决跨域时的Access-Control-Allow-Origin不应该还是通配符,而应该是具体的地址,所以后端express应该调整一下不再使用cors中间件,而是自己设置响应头
  • Access-Control-Allow-Credentials也应该设置为true
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 使用cors中间件部分换成下面的形式
app.use(function (req, res, next) {
  res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:5501')
  res.header('Access-Control-Allow-Credentials', 'true')
  next()
})

上面已经的警告已经说了:Cookie有一个SameSite属性,它默认是Lax,要求响应是对顶层导航的响应(这个顶层导航并不是很懂,有懂得小伙伴欢迎评论)。先按她的提示,设置Cookie的SameSite属性为none(安全性会下降)。SameSite属性的话,也必须要有Secure属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 设置Cookie
res.cookie("token", "123456", {
  httpOnly: true,
  expires: new Date(2030, 10, 10),
  secure: true,
  sameSite: 'none'
});

最终代码:

express:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const express = require("express");
const cors = require("cors");

const app = express();

app.use(function (req, res, next) {
  res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:5501')
  res.header('Access-Control-Allow-Credentials', 'true')
  next()
})

app.post("/token", function (req, res) {

  // 设置Cookie
  res.cookie("token", "123456", {
    httpOnly: true,
    expires: new Date(2030, 10, 10),
    secure: true,
    sameSite: 'none'
  });

  res.status(200).json({
    msg: "获取token成功",
  });
});

app.get("/getInfo", function (req, res) {
  res.json({
    msg: "成功",
  });
});

app.listen(8088, () => {
  console.log("http://localhost:8088");
});

html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<body>
    <button id="btn">获取token</button>
    <button id="test-btn">测试自动携带Cookie</button>
    <script>
        const btn = document.getElementById('btn')
        btn.addEventListener('click', fetchData)

        const testBtn = document.getElementById('test-btn')
        testBtn.addEventListener('click', getInfo)

        function fetchData() {
            fetch('http://localhost:8088/token', {
                method: 'post',
                credentials: 'include'
            })
        }

        function getInfo() {
            fetch('http://localhost:8088/getInfo', {
                credentials: 'include'
            })
        }
    </script>
</body>

解决方案2

上面的解决方案1,非常的麻烦,还把Cookie的SameSite属性改成None了,安全性也会下降一点

实际上呢,我们有一个更简单的解决方案,只需要把他们变成不跨域就行了。

express来测试的话,就是把之前的html代码放到express下的public文件夹里,

然后通过app.use(express.static(__dirname + '/public'))将静态文件目录设置为项目根目录+/public

然后,访问http://localhost:8088,就是我们写的html,不跨域,自然就没有解决方案1中出现的问题了.

当然,只看上面的例子的话,好像是用解决方案2的话,前后端就不能很好的分离了.其实并不是,我们可以通过nginx的代理来解决前后端的跨域问题.

可以使用Vue来简单实践代理能否解决这个保存携带Cookie问题.

首先呢?我们需要修改配置文件,实现代理.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  server: {
    // 实现其他设备能访问本机开启的服务
    host: '0.0.0.0',

    proxy: {
      '/api': {
        target: 'http://localhost:8088',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, '')
      }
    }
  }
})

fetch API的请求地址就不再需要去到后端的那个接口地址了,而是变成/api即可,这样子代理就会把这个请求转发给真实服务器.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <button @click="fetchData">获取token</button>
  <button @click="getInfo">测试自动携带Cookie</button>
</template>

<script setup>
function fetchData() {
  fetch("/api/token", {
    method: "post",
  }).then((res) => {
    // 获取响应的数据
    res.json().then((data) => {
      console.log(data);
    });
  });
}

function getInfo() {
  fetch("/api/getInfo").then((res) => {
    console.log(res);
  });
}
</script>

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
实战:Express 模拟 CSRF 攻击
CSRF攻击 是前端领域常见的安全问题,概念方面不再赘述,可以参考维基百科。对于这些概念,包括名词定义、攻击方式、解决方案等估计大家都看过不少,但留下印象总是很模糊,要动手操作一番才能加深印象并能真正理解,所以我决定动手实现一个 CSRF 的攻击场景,并通过演示的方式讲解 CSRF 的防范手段。
疯狂的技术宅
2021/02/25
1.4K0
实战:Express 模拟 CSRF 攻击
一个比较扯淡的跨域问题
2018-08-27更新: 使用cookie前强烈建议先看下MDN的这篇基础文章 创建cookie可以配置的选项 Expires,Secure,HttpOnly,Domain,Path,SameSite。 为避免跨域脚本 (XSS) 攻击,通过JavaScript的 Document.cookie API无法访问带有 HttpOnly 标记的Cookie,它们只应该发送给服务端。
mafeifan
2018/09/10
1.5K0
简单入门Fetch API
Fetch API是使用 JavaScript请求资源的优秀工具。虽然我们开发时可能是经常使用axios,但是实际上Fetch API也能做很多一样的事。并且使用Fetch API不需要安装axios,所以我们做一些小案例,但是需要调接口的话,Fetch API便是很好的选择,不需要安装axios,也不需要像XMLHttpRequest 对象那样子需要较多步骤。
赤蓝紫
2023/03/16
1.1K0
简单入门Fetch API
Express简单起一个本地服务接口
有时候我们开发过程中,需要一个接口调试,但是又不想很麻烦的要一个后台,就想很快的简单的有一个接口。今天分享使用node的express很简单的起一个服务。当然,express不会扩展,因为本人也不会。
wade
2020/04/24
5390
Express4.x API (三):Response (译)
Express4.x API 译文 系列文章 技术库更迭较快,很难使译文和官方的API保持同步,更何况更多的大神看英文和中文一样的流畅,不会花时间去翻译--,所以我们看到express中文网更多的还是
okaychen
2018/01/05
1.6K0
Express学习笔记
Express方法源于 HTTP 方法之一,附加到 express 类的实例。它可请求的方法包括:
kif
2023/02/27
3.8K0
Express学习笔记
web常见安全问题
Xss(cross site scripting)跨站脚本攻击,为了和css区分,所以缩写是xss。
hss
2022/02/25
1.6K0
前后端接口鉴权全解 Cookie/Session/Token 的区别
不知不觉也写得比较长了,一次看不完建议收藏夹!本文主要解释与请求状态相关的术语(cookie、session、token)和几种常见登录的实现方式,希望大家看完本文后可以有比较清晰的理解,有感到迷惑的地方请在评论区提出。
前端达人
2021/05/11
1.3K0
详解 Cookie,Session,Token
很久很久之前, Web基本都是文档的浏览而已。既然是浏览, 作为服务器, 不需要记录在某一段时间里都浏览了什么文档, 每次请求都是一个新的HTTP协议,就是请求加响应。不用记录谁刚刚发了HTTP请求, 每次请求都是全新的。
木子星兮
2020/10/09
2.1K0
详解 Cookie,Session,Token
重走Ajax之路1
Ajax:Asynchronous JavaScript+XML(异步 JavaScript+XML)的技术。它可以向服务器请求数据,而不刷新页面,即能够局部刷新,可以让用户有更好的用户体验。
赤蓝紫
2023/03/16
3870
重走Ajax之路1
Web安全之CSRF实例解析
跨站请求伪造(Cross Site Request Forgery),是指黑客诱导用户打开黑客的网站,在黑客的网站中,利用用户的登陆状态发起的跨站请求。CSRF攻击就是利用了用户的登陆状态,并通过第三方的站点来做一个坏事。
前端迷
2020/07/07
1.4K0
Web安全之CSRF实例解析
node+express操作cookie「建议收藏」
Cookie:有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
全栈程序员站长
2022/09/15
7000
node+express操作cookie「建议收藏」
node与vue结合的前后端分离跨域问题
withCredentials默认是false,意思就是不携带cookie信息,那就让它为true,我是全局性配置的,就是main.js中的这句话:
wfaceboss
2019/04/08
1.1K0
揭秘简单请求与复杂请求
开发网站时经常会用到跨域资源共享(简称cors,后面使用简称)来解决跨域问题,但是在使用cors的时候,http请求会被划分为两类,简单请求和复杂请求,而这两种请求的区别主要在于是否会触发cors预检请求。
挥刀北上
2019/07/19
5.6K0
揭秘简单请求与复杂请求
实用,完整的HTTP cookie指南
cookie 是后端可以存储在用户浏览器中的小块数据。 Cookie 最常见用例包括用户跟踪,个性化以及身份验证。
前端小智@大迁世界
2020/08/26
6.1K0
实用,完整的HTTP cookie指南
Node.js—Express使用、Express 路由 、Express 中间件、托管静态资源、使用 Express 写接口、node.js链接sqlite数据库
首先假定你已经安装了 Node.js,接下来为你的应用创建一个目录,然后进入此目录并将其作为当前工作目录。
HelloWorldZ
2024/03/20
2K3
Node.js—Express使用、Express 路由 、Express 中间件、托管静态资源、使用 Express 写接口、node.js链接sqlite数据库
基于TypeScript封装Axios笔记(九)
有些时候我们会发一些跨域请求,比如 http://domain-a.com 站点发送一个 http://api.domain-b.com/get 的请求,默认情况下,浏览器会根据同源策略限制这种跨域请求,但是可以通过 CORS 技术解决跨域问题。
用户7572539
2020/08/26
2.3K0
CORS 完全手册之 CORS 详解
在 CORS 完全手册之如何解决CORS 问题?里面我们提到了常见的CORS 错误解法,以及大多数状况下应该要选择的解法:「请后端加上response header」。
coder_koala
2021/04/21
1.8K0
cookie 和 session 原理
cookie + session 是为了保存用户状态信息的。比如这个用户是否已经登陆,如果登陆了就给这个用户推送一些信息,比如他最近买一些东西、他的购物车、他最近看过的文章或视频等信息。因为 http 是无状态的,所谓的无状态就是说每次请求完成后,不会在客户端和服务器上保存任何的信息。对于客户端和服务器而言,根本就不知道上次请求的信息是什么,甚至不知道本次连接的对端是不是上次连接的那一端。也就是说即使该用户登录了,但 HTTP 本身并不知道是哪个用户登陆了,HTTP 只处理请求与相应。因此如何知道一个用户登录了之后,后端能知道是哪个用户登录了,这是一个问题。
多云转晴
2020/02/17
1.1K0
cookie 和 session 原理
快速搭建一个express服务器
原文指引 → 一分钟搭建一个简单 express 服务器 | 你真是一个美好的人类 (juanertu.com)
花猪
2022/02/23
1.3K0
快速搭建一个express服务器
相关推荐
实战:Express 模拟 CSRF 攻击
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文