详解Springboot应用中设置Cookie的SameSite属性

Cookie除了keyvalue以外有几个属性。

  • httpOnly 是否允许js读取cookie
  • secure 是否仅仅在https的链接下,才提交cookie
  • domain cookie提交的域
  • path cookie提交的path
  • maxAge cookie存活时间
  • sameSite 同站策略,枚举值:Strict Lax None

其他的都很熟悉了,最后一个是 Chrome 51 开始,浏览器的 Cookie 新增加了一个 SameSite 属性,用来防止 CSRF 攻击和用户追踪。

关于SameSite的详细解释 可以看 Cookie 的 SameSite 属性

在Javaweb应用中 ,设置 Cookie一般都是用 javax.servlet.http.Cookie,但是SameSite属性出来不久,Servlet库还没更新,所以没有设置SameSite的方法.

javax.servlet.http.Cookie 中定义的的属性

可以看到,还没有SameSite的定义

//
// The value of the cookie itself.

private String name; // NAME= ... "$Name" style is reserved
private String value; // value of NAME
// Attributes encoded in the header's cookie fields.
private String comment; // ;Comment=VALUE ... describes cookie's use
// ;Discard ... implied by maxAge < 0
private String domain; // ;Domain=VALUE ... domain that sees cookie
private int maxAge = -1; // ;Max-Age=VALUE ... cookies auto-expire
private String path; // ;Path=VALUE ... URLs that see the cookie
private boolean secure; // ;Secure ... e.g. use SSL
private int version = 0; // ;Version=1 ... means RFC 2109++ style
private boolean isHttpOnly = false;

通过 ResponseCookie 给客户端设置Cookie

本质上,Cookie也只是一个header。我们可以不使用Cookie对象,而通过自定义Header的方式来给客户端设置Cookie

ResponseCookie 是Spring定义的一个Cookie构建工具类,极其简单

import java.time.Duration;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseCookie;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping
public class TestController {

	@GetMapping("/test")
	public Object test (HttpServletRequest request,
					HttpServletResponse response) throws Exception {

		ResponseCookie cookie = ResponseCookie.from("myCookie", "myCookieValue") // key & value
				.httpOnly(true)		// 禁止js读取
				.secure(false)		// 在http下也传输
				.domain("localhost")// 域名
				.path("/")			// path
				.maxAge(Duration.ofHours(1))	// 1个小时候过期
				.sameSite("Lax")	// 大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外
				.build()
				;

		// 设置Cookie Header
		response.setHeader(HttpHeaders.SET_COOKIE, cookie.toString());

		return "ok";
	}
}

响应给客户端的Cookie

所有属性都响应正确 √

HttpSession Cookie 的SameSite属性

HttpSession依赖一个名称叫做JSESSIONID(默认名称)的Cookie。

对于JSESSIONID Cookie 的设置,可以修改如下配置。但是,目前spring也没实现SameSite的配置项。

配置类 : org.springframework.boot.web.servlet.server.Cookie

server.servlet.session.cookie.comment
server.servlet.session.cookie.domain
server.servlet.session.cookie.http-only
server.servlet.session.cookie.max-age
server.servlet.session.cookie.name
server.servlet.session.cookie.path
server.servlet.session.cookie.secure

通过修改容器的配置,对Session Cookie设置SameSite属性

import org.apache.tomcat.util.http.Rfc6265CookieProcessor;
import org.apache.tomcat.util.http.SameSiteCookies;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TomcatConfiguration {
	@Bean
	public TomcatContextCustomizer sameSiteCookiesConfig() {
		return context -> {
			final Rfc6265CookieProcessor cookieProcessor = new Rfc6265CookieProcessor();
			// 设置Cookie的SameSite
			cookieProcessor.setSameSiteCookies(SameSiteCookies.LAX.getValue());
			context.setCookieProcessor(cookieProcessor);
		};
	}
}

Spring Session的SameSite属性

通过自定义 CookieSerializer 设置 SameSite属性

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.web.http.CookieSerializer;

import com.video.common.spring.session.DynamicCookieMaxAgeCookieSerializer;
@Configuration
public class SpringSessionConfiguration {

	@Bean
	public CookieSerializer cookieSerializer() {
		DynamicCookieMaxAgeCookieSerializer serializer = new DynamicCookieMaxAgeCookieSerializer();
		serializer.setCookieName("JSESSIONID");
		serializer.setDomainName("localhost");
		serializer.setCookiePath("/");
		serializer.setCookieMaxAge(3600);
		serializer.setSameSite("Lax");  // 设置SameSite属性
		serializer.setUseHttpOnlyCookie(true);
		serializer.setUseSecureCookie(false);
		return serializer;
	}
}

首发:https://springboot.io/t/topic/2602

到此这篇关于Springboot应用中设置Cookie的SameSite属性的文章就介绍到这了,更多相关Springboot设置Cookie的SameSite属性内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Springboot应用中设置Cookie的SameSite属性

    Cookie除了key和value以外有几个属性. httpOnly 是否允许js读取cookie secure 是否仅仅在https的链接下,才提交cookie domain cookie提交的域 path cookie提交的path maxAge cookie存活时间 sameSite 同站策略,枚举值:Strict Lax None 其他的都很熟悉了,最后一个是 Chrome 51 开始,浏览器的 Cookie 新增加了一个 SameSite 属性,用来防止 CSRF 攻击和用户追踪. 关

  • 详解springboot springsecuroty中的注销和权限控制问题

    目录 1账户注销 1.1在SecurityConfig中加入开启注销功能的代码 1.2在index.html添加注销的按钮 1.3启动项目测试 2权限控制 2.1导入springsecurity和thymeleaf的整合依赖 2.2springboot版本降级 2.3引入约束 2.4修改页面代码 2.5重启程序测试 承接:springboot-springsecuroty:用户认证和授权 1 账户注销 1.1 在SecurityConfig中加入开启注销功能的代码 src/main/java/c

  • 详解springboot springsecuroty中的注销和权限控制问题

    目录 1账户注销 1.1在SecurityConfig中加入开启注销功能的代码 1.2在index.html添加注销的按钮 1.3启动项目测试 2权限控制 2.1导入springsecurity和thymeleaf的整合依赖 2.2springboot版本降级 2.3引入约束 2.4修改页面代码 2.5重启程序测试 上篇文章给大家介绍了springboot对接第三方微信授权及获取用户的头像和昵称等等 1 账户注销 1.1 在SecurityConfig中加入开启注销功能的代码 src/main/

  • 详解Linux系统中设置SFTP服务用户目录权限的方法

    前言 在工作或者学习的时候,我们常常会遇到这样的需求,限制一个Linux用户,让他只能在指定的目录下进行添加.修改.删除操作,并且只能使用sftp登录服务器,不能用ssh操作.这些可以通过配置sftp服务实现. 方法如下 提供sftp服务的有vsftpd和internal-sftp,这里用的是系统自带的internal-sftp,操作步骤如下: 1.创建新用户ui,禁止ssh登录,不创建家目录 useradd -s /sbin/nologin -M www 2.设置用户密码 passwd www

  • 详解springboot整合ehcache实现缓存机制

    EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心容量问题. spring-boot是一个快速的集成框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 由于spring-boot无需任何样板化的配置文件,所以spring-boot集成一些其他框架时会有略微的

  • 详解springboot解决CORS跨域的三种方式

    目录 一.实现WebMvcConfigurer接口 二.实现filter过滤器方式 三.注解@CrossOrigin 四.实战 五.cookie的跨域 一.实现WebMvcConfigurer接口 @Configuration public class WebConfig implements WebMvcConfigurer { /** * 添加跨域支持 */ @Override public void addCorsMappings(CorsRegistry registry) { // 允

  • 详解SpringBoot中的tomcat优化和修改

    项目背景 在做项目的时候,把SpringBoot的项目打包成安装包了,在客户上面安装运行,一切都是那么的完美,可是发生了意外,对方突然说导出导入的文件都不行了.我急急忙忙的查看日志,发现报了一个错误 java.io.IOException: The temporary upload location [C:\Windows\Temp\tomcat.1351070438015228346.8884\work\Tomcat\localhost\ROOT] is not valid at org.ap

  • 详解SpringBoot上传图片到阿里云的OSS对象存储中

    启动idea创建一个SpringBoot项目 将上面的步骤完成之后,点击下一步创建项目 创建完成之后修改pom.xml文件,添加阿里云oss依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional&g

  • 详解SpringBoot中添加@ResponseBody注解会发生什么

    SpringBoot版本2.2.4.RELEASE. [1]SpringBoot接收到请求 ① springboot接收到一个请求返回json格式的列表,方法参数为JSONObject 格式,使用了注解@RequestBody 为什么这里要说明返回格式.方法参数.参数注解?因为方法参数与参数注解会影响你使用不同的参数解析器与后置处理器!通常使用WebDataBinder进行参数数据绑定结果也不同. 将要调用的目标方法如下: @ApiOperation(value="分页查询") @Re

  • 详解SpringBoot中关于%2e的Trick

    分享一个SpringBoot中关于%2e的小Trick.先说结论,当SpringBoot版本在小于等于2.3.0.RELEASE的情况下, alwaysUseFullPath 为默认值false,这会使得其获取ServletPath,所以在路由匹配时会对 %2e 进行解码,这可能导致身份验证绕过.而反过来由于高版本将 alwaysUseFullPath 自动配置成了true从而开启全路径,又可能导致一些安全问题. 这里我们来通过一个例子看一下这个Trick,并分析它的原因. 首先我们先来设置Sp

随机推荐