1. nannou

    No comment

    nannou
Changes in body
Source | HTML | Preview
@@ -1,73 +1,75 @@
(20/01/08 19:45追記)
## 概要
javax.servlet.http.CookieにはSameSite属性を付与するAPIがありません。
そんな時の対応です。
ちなみにSameSite属性はほぼ全てのブラウザが対応しています。
[参考](https://caniuse.com/#search=samesite)
## Cookieクラスを使用せず、Set-Cookieヘッダーを使用する
Spring bootでやってみます。
```java
@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!";
}
+
```
<img width="878" alt="Screen Shot 2019-08-06 at 17.11.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469184/a4ba2d13-33d6-b76a-d999-830147cb6aa3.png">
無事takeshiが入りました。
## Spring Boot編
Spring BootにはResponseCookieというヘッダー用のCookie文字列を作ってくれるクラスがあります。
このクラスを使用して、Set-Cookieでセットしたレスポンスを返却すると、Cookieをセットしてくれます。
```java
@RestController
public class DemoController {
- @GetMapping(value = "/")
- public String index(HttpServletResponse response) {
+ @GetMapping(value = "/")
+ public String index(HttpServletRequest request, HttpServletResponse response) {
- String name = "name";
- String value = "takeshi";
+ 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());
+ 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";
+ return "Hello, World";
}
}
+
```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469184/fd174bf6-128c-d0cd-3946-e0bd2edde728.png)
頻繁にCookie書き込みを行う場合は、パラメータで受け取ってセットするカスタムクラスを作った方が良さそうですね。
もしくはApacheやnginxなどのWebサーバ側で一括設定もできます。
[参考](https://dev.to/shosta/security-headers-to-use-on-your-webserver-3id5)
### 参考
[Class Cookie](https://docs.oracle.com/javaee/6/api/javax/servlet/http/Cookie.html)
https://stackoverflow.com/questions/42717210/samesite-cookie-in-java-application
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie
[Class ResponseCookie](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/ResponseCookie.html)