(20/01/08 19:45追記)
概要
javax.servlet.http.CookieにはSameSite属性を付与するAPIがありません。
そんな時の対応です。
ちなみにSameSite属性はほぼ全てのブラウザが対応しています。
参考
Cookieクラスを使用せず、Set-Cookieヘッダーを使用する
Spring bootでやってみます。
@RestController
public class DemoController {
@GetMapping(value = "/")
public String index(HttpServletResponse response) {
String name = "name";
String value = "takeshi";
String cookie = String.format("%s=%s; max-age=3600; Path=/; HttpOnly; Secure; SameSite=Lax;", name, value);
response.addHeader("Set-Cookie", cookie);
return "hello, world!";
}
無事takeshiが入りました。
Spring Boot編
Spring BootにはResponseCookieというヘッダー用のCookie文字列を作ってくれるクラスがあります。
このクラスを使用して、Set-Cookieでセットしたレスポンスを返却すると、Cookieをセットしてくれます。
@RestController
public class DemoController {
@GetMapping(value = "/")
public String index(HttpServletRequest request, HttpServletResponse response) {
String name = "name";
String value = "takeshi";
ResponseCookie cookie = ResponseCookie.from(name, value).domain("localhost").maxAge(Duration.ofDays((long) 1))
.httpOnly(true).secure(true).sameSite("Strict").build();
response.addHeader("Set-Cookie", cookie.toString());
return "Hello, World";
}
}
頻繁にCookie書き込みを行う場合は、パラメータで受け取ってセットするカスタムクラスを作った方が良さそうですね。
もしくはApacheやnginxなどのWebサーバ側で一括設定もできます。
参考
参考
Class Cookie
https://stackoverflow.com/questions/42717210/samesite-cookie-in-java-application
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie