-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathCookieBuilderUtil.java
More file actions
171 lines (156 loc) · 6.66 KB
/
CookieBuilderUtil.java
File metadata and controls
171 lines (156 loc) · 6.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
package life.mosu.mosuserver.global.util;
import jakarta.servlet.http.Cookie;
import lombok.experimental.UtilityClass;
import org.springframework.http.ResponseCookie;
/**
* MOSU 표준 쿠키 MOSU 인증 인가에 사용되는 쿠키를 생성하는 유틸리티 클래스입니다. 각 배포 환경(local, develop, production)에 맞는 쿠키를
* 생성하는 메서드를 제공합니다.
*
* @author Jihun Yu and Team Mosu
* @version 1.0
*/
@UtilityClass
public class CookieBuilderUtil {
public static final String ACCESS_TOKEN_COOKIE_NAME = "accessToken";
public static final String REFRESH_TOKEN_COOKIE_NAME = "refreshToken";
/**
* [로컬 환경용] ResponseCookie 객체를 생성합니다. (Secure=false, SameSite=Lax)
*
* @param name 쿠키의 이름 (예: "accessToken")
* @param value 쿠키에 저장될 값 (예: JWT 토큰 문자열)
* @param maxAge 쿠키의 만료 시간 (단위: 초). 0으로 설정 시 즉시 삭제됩니다.
* @return ResponseCookie 객체
*/
public static ResponseCookie createLocalResponseCookie(String name, String value, Long maxAge) {
return createBaseResponseCookieBuilder(name, value, maxAge)
.build();
}
/**
* [로컬 환경용] jakarta.servlet.Cookie 객체를 생성합니다.
*
* @param name 쿠키의 이름
* @param value 쿠키에 저장될 값
* @param maxAge 쿠키의 만료 시간 (단위: 초)
* @return jakarta.servlet.Cookie 객체
*/
public static Cookie createLocalCookie(String name, String value, Long maxAge) {
return createBaseServletCookie(name, value, maxAge);
}
/**
* [로컬 환경용] "Set-Cookie" 헤더 형식의 문자열을 생성합니다.
*
* @param name 쿠키의 이름
* @param value 쿠키에 저장될 값
* @param maxAge 쿠키의 만료 시간 (단위: 초)
* @return "Set-Cookie" 헤더 형식의 문자열
*/
public static String createLocalCookieString(String name, String value, Long maxAge) {
return createLocalResponseCookie(name, value, maxAge).toString();
}
/**
* [개발 환경용] 크로스-도메인 ResponseCookie 객체를 생성합니다. (Secure=true)
*
* @param name 쿠키의 이름
* @param value 쿠키에 저장될 값
* @param maxAge 쿠키의 만료 시간 (단위: 초)
* @return ResponseCookie 객체
*/
public static ResponseCookie createDevelopResponseCookie(String name, String value,
Long maxAge) {
boolean isProd = ProfileUtil.isProfileActiveStatic("prod");
return createBaseResponseCookieBuilder(name, value, maxAge)
.secure(isProd)
.domain(".mosuedu.com")
.sameSite("Strict")
.build();
}
/**
* [개발 환경용] 크로스-도메인 jakarta.servlet.Cookie 객체를 생성합니다.
*
* @param name 쿠키의 이름
* @param value 쿠키에 저장될 값
* @param maxAge 쿠키의 만료 시간 (단위: 초)
* @return jakarta.servlet.Cookie 객체
*/
public static Cookie createDevelopCookie(String name, String value, Long maxAge) {
Cookie cookie = createBaseServletCookie(name, value, maxAge);
cookie.setSecure(true);
cookie.setDomain(".mosuedu.com");
return cookie;
}
/**
* [개발 환경용] 크로스-도메인 "Set-Cookie" 헤더 형식의 문자열을 생성합니다.
*
* @param name 쿠키의 이름
* @param value 쿠키에 저장될 값
* @param maxAge 쿠키의 만료 시간 (단위: 초)
* @return "Set-Cookie" 헤더 형식의 문자열
*/
public static String createDevelopCookieString(String name, String value, Long maxAge) {
return createDevelopResponseCookie(name, value, maxAge).toString();
}
/**
* [운영 환경용] ResponseCookie 객체를 생성합니다.
* TODO: 운영 배포 시, 최종 도메인 및 SameSite 정책을 확정해야 합니다.
*
* @param name 쿠키의 이름
* @param value 쿠키에 저장될 값
* @param maxAge 쿠키의 만료 시간 (단위: 초)
* @return ResponseCookie 객체
*/
public static ResponseCookie createProductionResponseCookie(String name, String value,
Long maxAge) {
return createBaseResponseCookieBuilder(name, value, maxAge)
.secure(true)
.domain(".mosuedu.com") // TODO: 운영 도메인으로 변경
.sameSite("None") // TODO: 운영 정책에 맞게 Strict 또는 Lax로 변경 고려
.build();
}
/**
* [운영 환경용] jakarta.servlet.Cookie 객체를 생성합니다.
* TODO: 운영 배포 시, 최종 도메인 및 SameSite 정책을 확정해야 합니다.
*
* @param name 쿠키의 이름
* @param value 쿠키에 저장될 값
* @param maxAge 쿠키의 만료 시간 (단위: 초)
* @return jakarta.servlet.Cookie 객체
*/
public static Cookie createProductionCookie(String name, String value, Long maxAge) {
Cookie cookie = createBaseServletCookie(name, value, maxAge);
cookie.setSecure(true);
cookie.setDomain("api.mosuedu.com"); // TODO: 운영 도메인으로 변경
return cookie;
}
/**
* [운영 환경용] "Set-Cookie" 헤더 형식의 문자열을 생성합니다.
* TODO: 운영 배포 시, 최종 도메인 및 SameSite 정책을 확정해야 합니다.
*
* @param name 쿠키의 이름
* @param value 쿠키에 저장될 값
* @param maxAge 쿠키의 만료 시간 (단위: 초)
* @return "Set-Cookie" 헤더 형식의 문자열
*/
public static String createProductionCookieString(String name, String value, Long maxAge) {
return createProductionResponseCookie(name, value, maxAge).toString();
}
/**
* ResponseCookie의 기반이 되는 공통 속성을 설정하는 빌더를 생성합니다.
*/
private static ResponseCookie.ResponseCookieBuilder createBaseResponseCookieBuilder(String name,
String value, Long maxAge) {
return ResponseCookie.from(name, value)
.path("/")
.maxAge(maxAge)
.httpOnly(true);
}
/**
* jakarta.servlet.Cookie의 기반이 되는 공통 속성을 설정하여 객체를 직접 생성합니다.
*/
private static Cookie createBaseServletCookie(String name, String value, Long maxAge) {
Cookie cookie = new Cookie(name, value);
cookie.setPath("/");
cookie.setMaxAge(maxAge.intValue());
cookie.setHttpOnly(true);
return cookie;
}
}