做前后端分离项目时,登录认证基本都靠 JWT 来搞定。用户一登录,后端返回一个 token,之后每次请求都得带上它,服务器才能知道你是谁。那这个 JWT 到底该放在 HTTP 请求头的哪个位置?别乱放,不然后端根本拿不到。
标准做法:放在 Authorization 头里
最规范的方式,是把 JWT 放在请求头的 Authorization 字段中,并加上 Bearer 前缀。格式如下:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
注意,Bearer 和 token 之间有一个空格。这个写法是 RFC 6750 规定的标准,大多数框架比如 Spring Security、Express.js 的中间件都按这个来解析。
前端怎么加?以 JavaScript 为例
如果你用的是 Axios,可以这样设置:
<script>\naxios.defaults.headers.common['Authorization'] = 'Bearer ' + token;\n</script>
每次发送请求时,这个 header 就会自动带上。如果是原生 fetch,也类似:
<script>\nfetch('/api/user', {\n headers: {\n 'Authorization': 'Bearer ' + token\n }\n})\n</script>
为什么不放在 body 或 URL 里?
有人图省事,把 JWT 直接拼在 URL 后面,比如 /user?token=xxx,或者塞进 POST 的 body 里。这些方式虽然能传过去,但问题不少。
URL 拼参容易被日志记录、浏览器历史保存,泄露风险大。而 body 只适用于 POST 请求,GET 请求没法用。另外,很多安全策略和网关中间件默认只从 Authorization 头读 token,你放别的地方,可能直接被忽略。
后端也要配合
前端放对了,后端还得会取。一般在拦截器或中间件里读取 Authorization 头,提取出 token 后进行解码和验证。别忘了校验签名、过期时间这些,不然等于没保护。
其实就像去餐厅吃饭要出示会员卡一样,JWT 就是你身份的凭证。服务员(服务器)只认你挂在胸前的工牌(Authorization 头),你把它塞口袋里(body)或者写在手上(URL),人家很可能视而不见。