크롬과 엣지에서 결제 후 로그아웃이 되어버리고 결제정보가 남지 않는 이슈가 있었다.
사용자 입장에서는 결제를 다 했는데도 정보가 남지 않으니 회사에서 돈을 떼어가버리는 격...
토스 전자결제 페이지에서는 사용자의 결제내역이 남는데, 우리 테이블에는 정보가 남지 않고 있었다.
로컬에서 돌려보니 세션이 사라지고 있고, 사라진 세션에서 유저정보를 가져와서 데이터를 insert 하는 방식인데,
유저정보가 남지 않아 에러가 났는데도 우선은 익셉션으로 넘어가서 결제가 완료되었다는 알럿만 뜨고 있는 것이다.
구글링을 통해 알아낸 것은 2020년 2월에 출시된 chrome 80버전에서 samesite=lax 를 default로 하는 정책을 적용한 것.
엣지에서도 2020년 10월부터 86버전에 같은 정책을 적용시켰다.
samesite는 서드파티 통신 사이 쿠키의 보안정책을 적용한 것이다.
samesite = lax로 적용될 경우, 타 도메인을 다녀오면 cookie가 유실된다.
그래서 결제모듈(LG U+ : LG dacom)을 지나고 나면 세션이 사라져버리고 로그아웃이 되어버리는 것...!!
그 사이 많은 사용자들의 불만이 쇄도했을텐데.. CX팀 정말 고생 많으셨겠다..ㅠㅠ
HttpServletResponse 나 Cookie에 samesite=none, secure=true 로 설정해야 하고 Https 환경에서 유효한다고 나와있는데, 우리 시스템은 Spring Security를 사용하고 HttpSession에 유저정보를 담고 있다. 그래서 JSESSIONID 라는 세션이 생성되고 있다.
session이 유실되는 시점은 결제모듈에서 돌아오는 return 메서드에서였다.
그 곳에서 SameSite = None; Secure 설정을 해주기로 했다.
1. 쿠키 중 첫번째 JSESSIONID에만 설정해줌.
Cookie[] cookies = request.getCookies();
String session_cookie_name = "JSESSIONID";
if(cookies != null && cookies.length > 0){
list<Cookie> cookieList = Arrays.asList(cookies);
Cookie sessionCookie = cookieList.stream()
.filter(cookie -> session_cookie_name.equals(cookie.getName()))
.findFirst().orElse(null);
if(sessionCookie != null){
response.setHeader("SET_COOKIE", sessionCookie.getName()+"="sessionCookie.getValue()"+
"; SameSite = None ; Secure");
}
}
--> SameSite 설정이 먹히지 않고 세션이 그대로 유실됨.
2. 모든 쿠키를 재설정.
Cookie[] cookies = request.getCookies();
String session_cookie_name = "JSESSIONID";
if(cookies != null && cookies.length > 0){
list<Cookie> cookieList = Arrays.asList(cookies);
int i = 0;
for(Cookie cookie : cookieList){
if(cookie != null){
if(i = 0){
response.setHeader("SET_COOKIE", cookie.getName()+"="cookie.getValue()+"; SameSite = None ; Secure");
i++;
}else{
response.addHeader("SET_COOKIE", cookie.getName()+"="cookie.getValue()+"; SameSite = None ; Secure");
}
}
}
}
--> response에 헤더를 세팅할 때에는 처음에는 setHeader / 그 이후로는 addHeader 로 등록한다.
그걸 몰라서 다 setHeader 하느라고 이 소스를 적용시켜서 테스트해보지 못함....ㅋㅋ
3. 모회사에서 이렇게 설정했다고 하셔서 한 번 적용해봄.
response.setHeader("SET_COOKIE", "SameSite = None ; Secure");
--> 이유는 모르겠는데.. 이게 적용된다.
원하는 것이 아닌데, 크롬에서의 버그인지 모르겠지만, SameSite라는 이름의 쿠키가 None이라는 밸류로 생성된건데 (당연하지.. syntax인데..) 원래 있던 모든 쿠키를 SameSite 설정은 여전히 없는 채로 잃어버리지 않게 됨...!!!;;;
4. 임의의 이름으로 session 생성해줌.
response.setHeader("Set-Cookie", "SameSiteCookie = SameSiteValue; HttpOnly; Secure; SameSite = None");
--> SameSiteCookie라는 이름의 session이 HttpOnly, Secure, SameSite = None의 flag 를 가지고 생성되고, 다른 쿠키들은 쿠키의 flag 값 변동 없이 유지됨.
쿠키에 SameSite 설정을 바꾸고 싶은건데.....
5. 임의의 이름의 session 생성 후 모든 쿠키 재설정
response.setHeader("Set-Cookie", "SameSiteCookie = SameSiteValue; SameSite = None ; Secure");
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
List<Cookie> cookieList = Arrays.asList(cookies);
for(Cookie cookie : cookieList){
if(cookie != null){
response.addHeader("SET_COOKIE", cookie.getName()+"="cookie.getValue()+"; SameSite = None ; Secure");
}
}
}
--> SameSiteCookie 생성 + 다른 쿠키들 유지 + 다른 쿠키들 새로 중복 생성(SameSite = None 설정으로!!)
ㅎㅎㅎㅎ...
결국에는 4번 방법을 택했다.
언제 SameSite = None 설정을 넣어줘야 쿠키에 계속 설정되어있을지를 모르겠음....
filter나 웹서버에 설정해도 된다고 하지만, 현재 서비스되고 있는 프로그램이라 혹시나 오류가 있을까봐 그렇게는 하지 못함..ㅠㅠ
'주말에 쓰는 개발일기 > javascript' 카테고리의 다른 글
오류 : Uncaught TypeError: window.showModalDialog is not a function (0) | 2021.12.01 |
---|---|
크롬에서 opener의 함수호출 오류 (개발자도구를 켜야 작동할 경우) (0) | 2021.11.16 |
ArrayList 함수 clear() UnsupportedOperationException 에러. (0) | 2021.01.08 |
[ajax, javascript] file upload 유효성검사 (0) | 2021.01.08 |
ajax 에러 확인 / err:SyntaxError: Unexpected token < in JSON at position 0 (0) | 2021.01.08 |