axios无法携带cookie到后端,session可存cookie但不可取

登录逻辑采用session存储,并采用分布式redis缓存。

登录代码
request.getSession().setAttribute(USER_LOGIN_STATE, safetyUser);
验证代码
if (loginUser == null) {
            throw new BusinessException(ErrorCode.NO_LOGIN, "未登录");
        }
session配置
 spring:
  session:
    timeout: 86400
    store-type: redis
上线时出现的问题

image-20231210153722055

就是出现了跨域请求,浏览器默认在页面跳转时无法携带cookie

解决方案
server:
  port: 8081
  servlet:
    context-path: /api
    session:
      cookie:
        domain: 域名
        same-site: lax
        secure: false
  • 使用一级域名,因为二级域名也可以被解析为一级域名
  • 此方案必须在firefox下使用,chrome目前版本仍然被禁止
方案二
server:
  port: 8081
  servlet:
    context-path: /api
    session:
      cookie:
        domain: 域名
        same-site: none
        secure: true
  • same-site设置为none,secure必须为true。此时需要SSL证书,使用https协议,方可成功

原理探究:

chrome开始支持新属性SameSite,解决接口Cookie被滥用以及CSRF的问题。

SameSite属性简介

ameSite是Cookie的一个属性,其和path,domain一样,是一个普通的Cookie属性。其作用是限制该Cookie的在请求的时候是否被传递到Cookie所属服务的场景。

它一共有三个值,其基本含义分别如下:

Strict

Strict最为严格,完全禁止第三方 Cookie。即在跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。

设置方式为:Set-Cookie: CookieName=CookieValue; SameSite=Strict;

Lax

Lax规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外( top-level navigations)。

所有浏览器的Cookie默认SameSite属性都为Lax,即SameSite设置为空(未设置),则表示为Lax。

设置方式为:Set-Cookie: CookieName=CookieValue; SameSite=Lax;

设置了Strict或Lax以后,基本就杜绝了 CSRF 攻击。当然,前提是用户浏览器支持 SameSite 属性。

None

如果设置为None(前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效)。此时就表示Cookie不受约束在任何跨域场景下,只要设置了withCredentials=true都会发送到三方服务端。

设置方式为:Set-Cookie: CookieName=CookieValue; SameSite=None; Secure;

参考文章:

https://juejin.cn/post/6999262693715050533

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值