Double Submit Cookie的token怎么同时放在cookie和请求头里?
我在用Vue和Express实现Double Submit Cookie防护,但一直报错。后端设置的cookie是Secure和HttpOnly的,前端用document.cookie拿不到值。尝试在axios拦截器里加请求头:
axios.interceptors.request.use(config => {
const csrftoken = document.cookie.replace(/.*csrftoken=([^;]*)/, '$1');
config.headers['X-CSRF-Token'] = csrftoken;
return config;
});
但控制台提示cookie为空,后端返回403。明明登录时后端设置了Set-Cookie: csrftoken=xxx,难道HttpOnly导致无法读取?或者我应该把token存两份,一份HttpOnly,一份普通cookie?
后端应该生成两个token:
1. HttpOnly的cookie用于服务端校验(安全)
2. 普通cookie或直接返回token值给前端(非HttpOnly)
具体实现:
Express后端:
Vue前端:
关键点:
- HttpOnly的cookie只用于服务端校验
- 可读的token放在普通cookie或响应体
- 前端把可读的token放到请求头
- 服务端比较两个token是否一致
别折腾document.cookie读HttpOnly了,读不到的,我当初也踩过这个坑。要么用普通cookie要么直接从接口拿token值,性能上建议缓存起来避免每次请求都解析cookie。
前端axios拦截器不用改,应该能用。记得确保前后端的cookie domain和path配置一致,不然会有问题。