最近帮朋友准备跳槽面试,翻了不少大厂的笔试题,发现“网络认证协议”这块问得特别多。别看它只是内网通信里的一环,真要讲清楚,没点实打实的经验还真容易卡壳。
常见的认证协议有哪些?
这个问题几乎是必问的。实际工作中用得最多的是 Kerberos、OAuth 2.0、JWT 和 LDAP。比如你在公司登录内部系统,可能背后就是 Kerberos 在做票据验证;而你用微信或支付宝扫码登录某个网站,基本就是 OAuth 的套路。
Kerberos 的特点是依赖密钥分发中心(KDC),适合封闭内网环境。我们公司以前做内网穿透方案时,就遇到过客户端在 NAT 后面拿不到 TGT(票据授予票据)的问题,最后是通过部署代理服务转发请求解决的。
OAuth 2.0 的四种模式怎么答?
面试官如果追问细节,大概率会问这个。四种授权模式分别是:授权码模式、隐式模式、密码模式和客户端凭证模式。
最常用的是授权码模式,比如你在家里调试一个穿透到公司内网的服务,前端跳转到认证服务器,拿到 code 后由后端换 token,这样比较安全。代码流程大概是这样:
GET /authorize?response_type=code&client_id=xxx&redirect_uri=callback&scope=read
// 用户同意后跳回 callback?code=abc123
POST /token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=abc123&redirect_uri=callback&client_id=xxx&client_secret=secret
隐式模式直接返回 token,适合纯前端应用,但风险高,现在用得少了。
JWT 结构能说清楚吗?
JWS(JSON Web Signature)格式,三段式:头部、载荷、签名。比如你用 frp 做内网穿透,加了个简单的 token 验证,就可以用 JWT 来传身份信息。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
第一段是 alg 和 typ,base64 解码就能看到;第二段是用户信息;第三段是签名,防止篡改。注意,JWT 不加密,敏感数据别往里放。
为什么不能只用 Basic Auth?
有些小项目图省事,直接上 Base64 编码用户名密码,其实很危险。Base64 不是加密,随便一解就明文了。之前有次测试环境被人扫了,就是因为用了 Basic Auth 又没走 HTTPS,账号密码全暴露。
正确做法是搭配 HTTPS 使用,或者干脆换成 token 机制。像 nginx 做反向代理时,可以加 auth_request 模块走 OAuth 校验,比硬编码靠谱多了。
单点登录(SSO)和认证协议的关系
很多公司内部系统多,不可能每个都输一遍密码。SSO 就是靠统一认证服务实现的,背后常结合 SAML 或 OIDC(基于 OAuth 2.0)。比如你登录企业微信后,再进内部 CRM 自动免登,这就是 OIDC 在起作用。
做内网穿透时,如果要把本地服务接入公司 SSO,就得模拟好回调流程,确保 redirect_uri 能被公网访问,不然认证链就断了。