본문 바로가기

dev/java(egov)

pg 연동 후 로그인 세션 종료

반응형

java spring boot pg사 개발 중 로그인 세션이 종료되는 오류가 발생

크로스 도메인 처리라서 로그아웃 되는 현상이 발생합니다.

java spring > application.yml 수정
  • server.servlet.session.cookie.same-site: none
  • server.servlet.session.cookie.secure: true

1. server.servlet.session.cookie.same-site: none

  • 설명:
    SameSite 쿠키 속성을 설정합니다. 이 속성은 크로스 사이트 요청이 발생할 때, 쿠키가 어떻게 동작할지를 결정합니다.
    • None: 쿠키가 크로스 사이트에서 전송되는 것을 허용합니다. 이는 주로 OAuth와 같은 외부 인증 시스템을 사용할 때 필요합니다.
    • Lax: 기본값이며, 쿠키가 같은 사이트 내에서만 전송되고, 크로스 사이트 GET 요청에서는 전송되지 않습니다.
    • Strict: 쿠키가 같은 사이트 내에서만 전송되며, 크로스 사이트 요청에서는 전혀 전송되지 않습니다.
    여기서는 none으로 설정하여 크로스 사이트 요청에서도 쿠키가 전송되도록 허용하고 있습니다.

2. server.servlet.session.cookie.secure: true

  • 설명:
    이 설정은 Secure 쿠키 속성을 활성화합니다. secure: true로 설정하면, 쿠키는 HTTPS 연결에서만 클라이언트에 전송됩니다. 즉, 보안이 필요한 사이트에서는 이 설정을 통해 쿠키가 안전하게 전달되도록 할 수 있습니다.
    • 이 설정은 HTTPS가 아닌 HTTP로 애플리케이션을 실행하는 경우 쿠키가 전송되지 않도록 막습니다.
    위처럼
server:
  port: 8081
  servlet:
    context-path: /hoho
    session:
      cookie:
        same-site: none
        secure: true

 

처리를 하면 로그인은 유지를 합니다.

 

다만 로그인 처리는 유지되지만 csrf 토큰에러가 발생합니다.

 

아래처럼 pg 연동이 끝나고 돌아온 html페이지에서

아래 스크립트를 실행하여 토큰 처리를 합니다.

function refreshCsrfToken() {
    fetch(sessionStorage.getItem('contextPath')+'/api/csrf-token', { method: 'GET' })  // CSRF 토큰을 얻을 수 있는 API 엔드포인트
        .then(response => response.json())
        .then(data => {
            // 새로운 CSRF 토큰을 갱신하여 사용
            document.cookie = `XSRF-TOKEN=${data.token}; path=/`;

            $(`meta[name='${data.parameterName}']`,opener.document).prop("content", `${data.token}`);
            $(`input[name='${data.parameterName}']`,opener.document).val(`${data.token}`);

            window.close();
        });
}

 

/api/csrf-token 백엔드 페이지
@GetMapping("/api/csrf-token")
public CsrfToken csrfToken(HttpServletRequest request) {
    return (CsrfToken) request.getAttribute(CsrfToken.class.getName());
}

 

로그인 처리 후 토큰 처리까지 끝내면 정상 동작 하는 걸 확인하실 수 있습니다.

반응형