全栈面试:网络与安全
从输入 URL 到页面展示发生了什么?
典型流程:
- 浏览器解析 URL。
- DNS 解析域名。
- 建立 TCP 连接。
- HTTPS 场景下进行 TLS 握手。
- 浏览器发送 HTTP 请求。
- 服务端处理请求并返回响应。
- 浏览器解析 HTML、CSS、JS。
- 构建 DOM 和 CSSOM。
- 执行 JS,渲染页面。
这是全栈面试高频题,回答时可以按网络、服务端、浏览器渲染三层展开。
HTTP 和 HTTPS 有什么区别?
HTTPS = HTTP + TLS。
HTTPS 提供:
- 加密传输
- 身份认证
- 数据完整性校验
HTTP 明文传输,容易被窃听和篡改。
登录、支付、用户信息等场景必须使用 HTTPS。
HTTP 状态码常见有哪些?
常见状态码:
- 200 成功
- 201 创建成功
- 204 成功但无内容
- 301 永久重定向
- 302 临时重定向
- 304 缓存未修改
- 400 请求参数错误
- 401 未登录
- 403 无权限
- 404 资源不存在
- 409 冲突
- 429 请求过多
- 500 服务端错误
- 502 网关错误
- 503 服务不可用
面试时要能结合接口设计说明使用场景。
Cookie、Session、Token 有什么区别?
Cookie 是浏览器存储并随请求发送的小段数据。
Session 是服务端保存的会话状态,客户端通常通过 Cookie 保存 session id。
Token 是一种令牌,常见于前后端分离和移动端。
常见区别:
- Session 状态在服务端。
- JWT token 通常自包含,服务端可无状态校验。
- Cookie 可以配合
HttpOnly、Secure、SameSite增强安全。
XSS 是什么?怎么防?
XSS 是攻击者把恶意脚本注入页面,导致脚本在用户浏览器执行。
防护方式:
- 输出转义
- 不直接插入不可信 HTML
- 使用 CSP
- Cookie 设置
HttpOnly - 对用户输入做过滤
前端框架默认会对插值转义,但 v-html、dangerouslySetInnerHTML 这类能力要谨慎使用。
CSRF 是什么?怎么防?
CSRF 是攻击者诱导用户浏览器带着登录态向目标网站发起请求。
防护方式:
- CSRF Token
- SameSite Cookie
- 验证 Referer / Origin
- 关键操作二次确认
如果使用 token 放在 Authorization header 中,CSRF 风险会降低,但仍要注意 XSS。
SQL 注入是什么?怎么防?
SQL 注入是攻击者把恶意 SQL 片段拼进查询语句。
防护方式:
- 使用参数化查询
- ORM 正确绑定参数
- 不拼接用户输入
- 最小权限数据库账号
- 输入校验
不要只依赖前端校验,后端必须防护。
常见安全响应头有哪些?
常见响应头:
Content-Security-PolicyX-Frame-OptionsX-Content-Type-OptionsStrict-Transport-SecurityReferrer-Policy
它们可以帮助减少 XSS、点击劫持、类型嗅探等风险。
如何做限流?
常见限流算法:
- 固定窗口
- 滑动窗口
- 令牌桶
- 漏桶
常见维度:
- IP
- 用户 ID
- 接口
- API key
登录、短信、搜索、AI 调用等接口都需要考虑限流。
网络安全面试追问
HTTPS 握手过程是什么?
HTTPS 基于 TLS。简单说,客户端先发起握手并告诉服务端支持的 TLS 版本和加密套件;服务端返回证书;客户端校验证书可信后,双方协商出会话密钥;后续 HTTP 数据用对称加密传输。
面试时可以抓住重点:证书解决身份可信,非对称加密用于协商密钥,对称加密用于高效传输,摘要和签名用于防篡改。
TCP 三次握手和四次挥手是什么?
三次握手用于建立可靠连接,核心是双方确认彼此的发送和接收能力正常。流程可以概括为:客户端发 SYN,服务端回 SYN+ACK,客户端再回 ACK。
四次挥手用于关闭连接,因为 TCP 是双向通信,一方关闭发送能力后,另一方可能还有数据要发送。面试时要说明:三次握手是为了可靠建立连接,四次挥手是为了可靠释放双向连接。
HTTP/1.1、HTTP/2、HTTP/3 有什么区别?
HTTP/1.1 支持长连接,但同一连接上请求响应仍容易受到队头阻塞影响。HTTP/2 引入二进制分帧、多路复用、头部压缩,能在一个 TCP 连接上并发多个请求。
HTTP/3 基于 QUIC 和 UDP,减少 TCP 层队头阻塞,并优化连接建立速度。面试回答可以结合性能:HTTP/2/3 主要是提高并发传输效率和弱网体验。
如何防止接口被刷?
接口防刷通常从限流、鉴权、验证码、风控、黑白名单和成本控制入手。高风险接口可以按 IP、用户、设备、接口、租户等维度限制频率。
如果是短信、登录、AI 调用等高成本接口,还要做行为分析、失败次数限制、冷却时间和告警。回答时要强调:防刷不是一个验证码能解决,而是多层防护。
如何保护用户密码?
密码不能明文存储,也不能用普通 MD5 直接存。应该使用专门的密码哈希算法并加盐,例如 bcrypt、scrypt、Argon2。
传输层要使用 HTTPS,登录失败要限制频率,重置密码要使用短期 token,并记录安全审计日志。即使数据库泄露,也要尽量提高攻击者破解成本。
如何做文件上传安全?
文件上传要限制类型、大小、数量和权限,不能只相信前端后缀名。后端要检查 MIME、文件签名,重命名存储,避免用户控制存储路径。
上传后的文件最好放到对象存储或隔离域名,不直接在业务服务目录执行。图片可做压缩和 EXIF 清理,高风险文件需要病毒扫描。
如何处理跨域和 CORS?
跨域是浏览器同源策略限制,不是服务器不能访问服务器。CORS 由服务端返回允许的来源、方法、请求头和是否携带凭证。
如果需要携带 Cookie,Access-Control-Allow-Origin 不能写 *,并且要配置 Access-Control-Allow-Credentials。开发环境可以用代理,生产环境通常由网关或后端统一配置。
如何设计安全的登录态?
登录态可以用 Session、JWT 或短 token + refresh token。关键是过期时间、刷新机制、退出登录、设备管理、权限变更后的失效策略。
如果 token 放 Cookie,要设置 HttpOnly、Secure、SameSite;如果放本地存储,要重点防 XSS。高风险操作还可以要求二次验证。