跨域、CORS、CSRF、SameSite 彻底讲清楚
跨域、CORS、CSRF、SameSite —— 前端开发中最容易混淆的一套概念,彻底讲清楚前言 “后端开发出身的人,第一次碰前端跨域问题,十有八九会被搞晕。” 我就是这样。 我在后端写接口写得好好的,前端一连就说”跨域报错”。我心想:“我接口都写对了,你浏览器凭什么拦我?” 然后浏览器说:“这是为你好,防止 CSRF 攻击。” 我又心想:“CSRF 又是什么东西?跨域跟 CSRF 什么关系?” 然后我去搜解决方案,有人跟我说加 CORS 头,有人跟我说用 SameSite cookie,有人跟我说 CSRF token……我彻底懵了。 这篇文章就是为了当时的我写的。从最底层开始,一层一层讲清楚: 为什么浏览器要限制跨域? CORS 是在解决什么问题? CSRF 又是什么?跟跨域什么关系? SameSite Cookie 又是干什么的? 代码里 trustedOrigins 到底该配置什么? 最终你会发现:这些概念并不复杂,只是没人把它们串起来讲。 目录 三个核心问题 先搞清楚:什么是”跨域”? 为什么浏览器要限制跨域? CORS —— 跨域资源共享 CSRF —— 跨站...
MCP vs Agent 全面对比与最佳实践
MCP vs Agent —— 它们到底是什么?有什么区别?什么时候该用哪个?前言最近 AI 开发领域有两个词频繁出现:MCP 和 Agent。 很多人刚接触时会混淆:它们不都是让 AI 能”做事”的吗?区别在哪?有了 Agent 为什么还要 MCP?MCP 会替代 Agent 吗? 这篇文章从最底层逻辑开始,帮你彻底理清这两个概念。 目录 一个类比:先建立直觉 什么是 MCP? 什么是 Agent? MCP vs Agent —— 全面对比 相同点:它们解决什么问题 不同点:核心思维差异 应用场景 MCP + Agent = 黄金组合 总结 1. 一个类比:先建立直觉在深入技术细节之前,先用一个外卖系统的类比建立直觉。 1234567891011121314151617181920你饿了,想吃饭。选择 A —— 你直接打电话给饭店: "喂,我要一份鱼香肉丝盖饭" 饭店做好,送到你家选择 B —— 你打开美团/饿了么: 打开 App → 浏览菜单 → 下单 → 骑手取餐 → 送到你家MCP 就像是"美团/饿了么"这个平...
从 Tokenizer 到 Embedding 再到 RAG
从 Tokenizer 到 Embedding 再到 RAG —— 大模型是怎么”理解”并”查找”信息的?前言你有没有想过这些问题: 大模型明明只认识数字,为什么它能理解”猫”和”狗”是相似的? RAG 说”从知识库检索相关内容”,它是怎么知道哪些内容跟我的问题相似的? Tokenizer 把文本切成 Token,Embedding 把 Token 变成向量——这两步到底有什么关系? 这篇文章会从最底层开始,把编码 → 向量化 → 相似搜索 → RAG 检索这条完整的链路讲清楚。 看完你会明白:为什么 Tokenizer 的分词质量直接影响 RAG 的检索准确性。 目录 编码的三层境界 第一层:Tokenizer —— 把文本切成块 第二层:Embedding —— 把 Token 变成向量 第三层:语义空间 —— 向量为什么能表示”相似” RAG 的完整检索流程 Tokenizer 如何影响 RAG 的检索准确性 实践:一个 RAG 系统的编码链路 总结 1. 编码的三层境界整个编码过程可以理解为三个层层递进的阶段: 12345678910自然语言 ...
彻底搞懂 Token
彻底搞懂 Token —— 大模型世界的”字数”到底怎么算?中文一定比英文费钱吗?前言 “中文一个 token 对应一个字?那文言文那么简短,岂不是能省很多 token?” 这是我给外行同事解释 Token 时最常听到的问题。 这个想法看起来很有道理:文言文用几个字就能表达一大段白话文的意思,如果每个字=一个 token,那文言文应该能省 50% 以上的 token 对吧? 答案是:不对。完全不对。 不仅不对,有时候文言文反而更费 token。 这篇文章会把 Token 这个概念从里到外掰开揉碎讲清楚,看完你就知道为什么了。 1. Token 到底是什么?1.1 最直白的定义Token 是 LLM(大语言模型)处理文本时的最小基本单位。 它不是字母,也不是完整的单词,而是一个”词块”(subword)。 类比:句子是一面墙,Token 就是砌墙的砖。一块砖可能大、可能小,但它是不可再分的基本单元。 1.2 为什么需要 Token?大模型本质上是数学机器,它不认识文字,只认识数字。 所以需要一个步骤把文本转换成数字: 123原始文本 → Token(分词)→ ID...
AI Agent 沙箱深度解析
AI Agent 沙箱深度解析 —— 为什么 Agent 需要沙箱?沙箱 vs 容器 vs 虚拟机有什么区别?前言如果你用过或者看过 AI Agent 的相关工具(比如 OpenAI Code Interpreter、AutoGPT、LangChain 的沙箱执行器),会发现它们几乎都有一个共同的设计——沙箱。 为什么 Agent 非要沙箱不可?直接用 Docker 不行吗?用虚拟机不是更安全吗? 这篇文章会把这些概念彻底讲清楚。 目录 一个灵魂拷问:Agent 执行代码到底有多危险? 什么是沙箱? 四大隔离技术全家桶 沙箱 vs 容器 vs 虚拟机 —— 全面对比 为什么 AI Agent 选择了沙箱? 常见的 Agent 沙箱方案 沙箱的局限性 生产环境的最佳实践 总结与脑图 1. 一个灵魂拷问:Agent 执行代码到底有多危险?1.1 一个典型场景假设你构建了一个 AI Agent,用户对它说: “帮我分析一下服务器上的 Nginx 日志,找出最近一小时的 500 错误,写一个分析报告保存到桌面。” Agent 会做什么? 12345678910111213# A...
大模型开发核心概念解析
大模型开发核心概念解析 —— Harness、Prompt、LLM、Agent、Context 到底是什么?前言刚开始接触大模型开发时,各种术语扑面而来:LLM、Prompt、Agent、RAG、Fine-tuning、Context、Harness…… 这些概念分别是什么意思?它们各自解决什么问题?它们之间的关系是什么?从零搭建一个大模型应用时,哪些是必须的? 这篇文章帮你一次性理清楚。 目录 大模型应用的整体架构 LLM —— 大脑 Prompt —— 指挥棒 Context —— 短期记忆 Agent —— 自主行动的躯干 Harness —— 缰绳与缰绳架 其他重要概念 它们如何协同工作 总结与脑图 1. 大模型应用的整体架构在深入每个概念前,先用一张图建立整体认识: 123456789101112131415161718192021222324252627282930313233┌─────────────────────────────────────────────────────┐│ 用户输入 ...
JWT 完全解析
JWT 完全解析 —— 从原理到实践,掰开了揉碎了讲清楚前言最近在学习 FastAPI 时遇到了登录认证的问题,接触到了 JWT 这个概念。说实话刚看到 JWT 时一头雾水:它是什么?为什么登录要用它?跟 session 有什么区别?里面的那一长串乱码到底藏了什么秘密? 这篇文章就是我对 JWT 的完整学习笔记,力求掰开了、揉碎了,把每一个知识点都讲清楚。 目录 JWT 是什么? 为什么需要 JWT?—— 从 Session 的痛点说起 JWT 长什么样? JWT 的三部分:Header · Payload · Signature JWT 的工作流程(核心逻辑) JWT 的签名是怎么保证安全的? JWT 的优缺点 JWT 在 FastAPI 中的实战 常见安全问题与防范 总结与脑图 1. JWT 是什么?JWT 全称 JSON Web Token,读作 “jot”(/dʒɒt/)。 官方的定义是:一种紧凑的、URL 安全的、用于在双方之间传递声明(claims)的令牌格式。 翻译成人话就是: JWT 是一段有结构的字符串,里面可以安全地存放一些信息(比...
pnpm Monorepo 跨环境构建失败排查实录
pnpm Monorepo 跨环境构建失败排查实录:一个 Zod 类型幽灵导致的深坑背景项目 P001-OPC 是一个基于 Next.js 15 + React 19 的企业级 Monorepo 应用,使用 pnpm 管理依赖,技术栈包括: 构建:pnpm 10.14 + Turbo 2.5.6 框架:Next.js 15.5.0 / React 19.1.1 / TypeScript 5.9.2 文档:Fumadocs 15.7.1 + @content-collections/core 0.11.0 验证:Zod 3.24+ 数据库:Prisma 6.14.0 本地开发和构建一切正常,但将代码部署到服务器执行 pnpm build 时,反复出现类型错误。 现象本地 pnpm build 完美通过,服务器上同样的代码、同样执行 pnpm install,构建时报错: 12./app/(marketing)/[locale]/docs/[[...path]]/page.tsx:26:19Type error: Property 'to...
为什么部署里有一个 build 容器还有一个 api 容器
为什么部署里有一个 build 容器还有一个 api 容器 项目:SGCC 智能服务控制台 · 学习记录 起因我重构完部署后,看着 docker-compose.yaml 里的服务列表犯嘀咕: 123456services: db # 数据库 frontend-build # ? api # ? nginx # 反向代理 + 静态托管 backend # Python 数据管线 「我不就是部署个前端嘛,为什么还要有一个 api 容器?前端应该 build 完用 nginx 反代 index.html 就够了啊?」 ——这是我那天的原话。后面被纠正了我才意识到:「前端」这个词在我脑子里和实际意义不一致。 下面把这件事彻底理清楚。 概念修正:「前端」≠「整个网站」浏览器里能跑什么、不能跑什么能跑的: HTML / CSS / JS(这些都是死的文本文件) 渲染界面、响应点击 调 fetch() 给某个 URL 发请求 不能跑的: 连数据...
从一份渗透报告开始的安全加固
从一份渗透报告开始的安全加固 项目:SGCC 智能服务控制台 · 学习记录 起因攻击方递来一份渗透报告,两个高危: 1234567891. 目录遍历 GET http://x.x.x.x:3000/@fs/server/index.js GET http://x.x.x.x:3000/@fs/node_modules/pg/lib/client.js GET http://x.x.x.x:3000/@fs/node_modules/multer/README.md GET http://x.x.x.x:3000/@fs/node_modules/express/index.js2. 任意文件读取(CVE-2025-30208) GET http://x.x.x.x:3000/@fs/etc/passwd?raw → 直接读出 /etc/passwd 的内容 我看完第一反应是:完了,源码全裸了。 根因:把开发服务器丢到生产/@fs/ 是 Vite 开发服务器(dev server)专用的源码读取端点,给热更新(HMR)用的。它的设计前提是「跑在开发者本机...









