๋ฌธ์ ์ํฉ
ํ์ ๋๋ฉ์ธ(api.weddingmate.co.kr)์์ ์์ ๋๋ฉ์ธ(weddingmate.co.kr)์ผ๋ก ์ฟ ํค๋ฅผ ๋ณด๋ด์ผ ํ๋ ์ํฉ
ResponseCookie.from("refreshToken", refreshToken)
.path("/")
.domain("weddingmate.co.kr")
.maxAge(TimeUnit.MILLISECONDS.toSeconds(refreshTokenValidationTime))
.secure(true)
.sameSite("None")
.httpOnly(true)
.build();
๋ฐ์ ์์ธ
Redis์ ์ ์ฅ๋ refreshToken ๊ฐ(1)๊ณผ ์ฟ ํค์ ๋ด์์ ์ ๋ฌ๋๋ refreshToken ๊ฐ(2)์ด ๋ค๋ฆ
์ฟ ํค ์ ๋ฌ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ผ๋ก ํ์
public ResponseCookie generateRefreshTokenCookie(String email) {
String refreshToken = tokenProvider.createRefreshToken(email);
Long refreshTokenValidationTime = tokenProvider.getRefreshTokenValidationMs();
// (1)
redisService.setData("RefreshToken:" + email, refreshToken, refreshTokenValidationTime);
// (2)
return ResponseCookie.from("refreshToken", refreshToken)
.path("/") // ํด๋น ๊ฒฝ๋ก ํ์์ ํ์ด์ง์์๋ง ์ฟ ํค ์ ๊ทผ ํ์ฉ. ๋ชจ๋ ๊ฒฝ๋ก์์ ์ ๊ทผ ํ์ฉํ๋ค.
.domain(".weddingmate.co.kr")
.maxAge(TimeUnit.MILLISECONDS.toSeconds(refreshTokenValidationTime)) // ์ฟ ํค ๋ง๋ฃ ์๊ธฐ(์ด). ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๋ซํ ๋ ์ ๊ฑฐ
.secure(true) // HTTPS๋ก ํต์ ํ ๋๋ง ์ฟ ํค๊ฐ ์ ์ก๋๋ค.
.sameSite("None") // ํฌ๋ก์ค ์ฌ์ดํธ์๋ ์ฟ ํค ์ ์ก ๊ฐ๋ฅ
.httpOnly(true) // JS๋ฅผ ํตํ ์ฟ ํค ์ ๊ทผ์ ๋ง์, XSS ๊ณต๊ฒฉ ๋ฑ์ ๋ฐฉ์ดํ๊ธฐ ์ํ ์ต์
์ด๋ค.
.build();
}
ํด๊ฒฐ ๋ฐฉ๋ฒ
๋๋ฉ์ธ ์์ .์ ๋ถ์ฌ ๋ชจ๋ ์๋ธ๋๋ฉ์ธ ๊ฐ์ ์ฟ ํค๊ฐ ๊ณต์ ๋๋๋ก ํจ
ResponseCookie.from("refreshToken", refreshToken)
.path("/")
.domain(".weddingmate.co.kr") //
.maxAge(TimeUnit.MILLISECONDS.toSeconds(refreshTokenValidationTime))
.secure(true)
.sameSite("None")
.httpOnly(true)
.build();
๋ง์ฝ ์๋ธ๋๋ฉ์ธ ๊ฐ์ ์ฟ ํค ๊ณต์ ๊ฐ ํ์ํ์ง ์๋ค๋ฉด ๋๋ฉ์ธ์ weddingmate.co.kr๋ก ์ค์ ํ์ฌ ํ์ฌ ๋๋ฉ์ธ์๋ง ์ฟ ํค๋ฅผ ์ฌ์ฉ
๋๊ธ