token到底存在cookie还是Authorization字段呢?
点击下方“ JavaEdge ”,选择“ 设为星标 ”
第一时间关注技术干货!免责声明~
任何文章不要过度深思!
万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」;
不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人。
怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」
无论对前端还是后端,这两种方案都各有利弊,根据需求选用。
1 将 token 放在 cookie 里
前端可完全不写代码,设置 cookie 可依赖后端的 Set-Cookie
响应头,同域名情况下发送所有请求的时候 cookie 也是自动带上。
坏处
造成网络流量和带宽的浪费,所以 CDN 的域名都是和主站不同的,避免请求带上 cookie 浪费流量。
安全性
cookie 可设置 HttpOnly
来保护 cookie 无法被 JS 代码捕获,避免 XSS 等攻击,还可设置 Secure
来确保只在 https 环境下传输 token;这些能力由浏览器提供,Authorization 无法实现。
但cookie存在 CSRF 攻击的问题,虽然浏览器厂商在逐步禁止第三方 cookie(似乎推迟到 2024 年了),但这问题还是不得不防(如想使用第三方 cookie,可在后端响应中设置 cookie 的 SameSite 属性);
在一级域名相同时,cookie可实现跨子域名互通,如
-
a.example.com
-
b.example.com
之间可实现 cookie 互通(设置 cookie 时提供 Domain=example.com
属性),这能力 Authorization 也不具备。
网页的图片 <img />
请求时也会自动带上 cookie:
- 好处,便于控制网络图片的访问权限,如网络相册的权限控制可以精确到用户级,Authorization做不到,它须把 token 放在 url 查询里面
- 缺点:如网页中的背景图、icon 等资源图片放在相同域名下,每次请求这些资源图片都会带上 cookie,浪费带宽和服务器的流量, 所以 CDN 域名要和主域名区分开
2 将 token 放在请求头里,用 Authorization 字段:
此字段需由 JS 代码写入,请求想要带上 Authorization
字段,则需用 JS 代码给请求方法添加全局拦截器,因此它天生具备防止 CSRF 的功能。
只有浏览器使用 cookie,而 Node.js 等环境没有 cookie 的(现在小程序也可支持 cookie),只能使用 Authorization;因为此字段完全由 JS 操作;虽然它原生没有提供 cookie 的 Secure
、Expires
等功能,但可通过 JS 代码自行实现。
前端将 token 持久存储,一般存储在 LocalStorage,此时存在 XSS 攻击盗取 token 问题(将 LocalStorage 里的 token 加密可一定避免),而且它无法跨域互通,即使两个网站的一级域名相同也无法互通。
认证规范要求
必须使用 Authorization
字段,如 JWT,如使用相关认证(尤其是第三方服务),则必须使用此字段。
参考
- https://www.zhihu.com/question/558219586/answer/2710675882
写在最后
公众号
:JavaEdge
专注分享软件开发全生态相关技术文章
、视频教程
资源、热点资讯等,如果喜欢我的分享,给 🐟🐟 点一个赞
👍 或者 ➕关注
都是对我最大的支持。
欢迎长按图片加好友
,我会第一时间和你分享软件行业趋势
,面试资源
,学习途径
等等。
添加好友备注【技术群交流】拉你进技术交流群
关注公众号后,在后台私信:
- 回复 【架构师】 ,获取架构师学习资源教程
- 回复【面试】 ,获取最新最全的互联网大厂面试资料
- 回复【简历】 ,获取各种样式精美、内容丰富的简历模板
- 回复 【路线图】 ,获取直升Java P7技术管理的全网最全学习路线图
- 回复 【大数据】 ,获取Java转型大数据研发的全网最全思维导图
- 更多教程资源应有尽有,欢迎
关注,慢慢获取