본문 바로가기

트러블슈팅

[트러블슈팅] EC2 배포 후 세션 유지가 안되는 문제 feat. http와 쿠키

문제 상황

웹 애플리케이션 개발 프로젝트에서 발생한 문제이다.

 

나는 백엔드 개발 팀에서 개발을 맡았고, 우리의 시스템은 일단 세션 방식으로 인증이 구현되어 있었다.

 

백엔드에서 간단하게 API 프로토타입을 완성하였고, 프론트엔드와 한번 API 연동 테스트를 진행하려 했다.

 

프론트엔드 쪽에서 API 테스트를 하기 편하도록 나는 AWS EC2에 백엔드 서버를 배포하고 엔드포인트를 안내했다.

 

아니 근데 분명 로컬에서 내가 프론트엔드와 테스트를 진행했을 때는 인증이 잘 처리되었는데, 이상하게 EC2 환경으로만 넘어가면 로그인을 해도 세션 유지가 안된다. 백엔드에서는 로그를 찍어 로그인 후에 정상적으로 세션을 생성하는 것을 확인했다.

 

원인은 무엇이었을까?

원인 분석

일단 우리는 세션에 대한 정보를 알기 위해서는 클라이언트 요청에 JSESSIONID가 쿠키에 포함되어 백엔드로 전송되어야 백엔드에서는 세션 식별이 가능한 구조이다.

이를 포함하기 위해서 withCredentials 옵션을 true로 설정하여 프런트엔드에서는 api 호출을 진행한다.

 

근데 자꾸 로그인 이후의 요청들이 세션이 없다는 결과를 응답받게 되고 요청 쿠키를 보니 포함되어 있어야 할 JSESSIONID가 포함이 되어있지 않았다.

 

분명 프런트엔드 + 백엔드를 로컬에서 테스트할 때는 잘만 돌아가던 요청이..

API 서버를 동일한 백엔드 소스로 EC2로 배포만 했을 뿐인데 갑자기 세션 유지가 안되어서 어지러웠다.

 

근데 이는 알고 보니 http는 요청에 쿠키를 포함하지 않도록 막는 문제 때문에 http를 사용 중인 EC2로는 쿠키 전송이 안되어서 발생한 문제였다.

 

이유가 무엇일까? 일단 http는 데이터를 암호화하지 않고 평문으로 보내는 프로토콜인데 쿠키와 같은 민감 정보가 평문으로 보내지는 것을 자동으로 막는다. 우리가 보내는 JSESSIONID 또한 쿠키에 담겨 보내지는 민감한 정보이다.

 

어떻게 해결을 해야 할지 한번 알아보자.

 

+ https는 어떻게 데이터를 안전하게 보낼까에 대한 글을 최근에 정리해 두었는데 관심 있으신 분들은 한번 보셔도 좋을 듯합니다..

https://programmerjoon.tistory.com/47

해결 방법

  1. EC2 백엔드 서버를 HTTPS로 변경
  2. 동일한 로컬호스트 환경에서 테스트
    1. Docker 이미지 빌드 후 공유
    2. .jar 빌드 파일 공유 후 공유