CI 묻고 답하기

제목 [해결] CI4 ajax 호출로 세션에 저장된 정보 가져오기
카테고리 CI 4 관련
글쓴이 의붓집토토로 작성시각 2022/11/10 18:31:59
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 4695   RSS

안녕하세요. 현재 CI4 공부하고 있는 중에 세션 관련해서 몇달동안 해결이 안되어 여기에 글을 올려봅니다.

저는 서비스들을 작게 쪼개서 하나의 서비스가 죽어도 다른 서비스는 살아 있을 수 있게끔 마이크로 서비스로 구성할 계획이 있습니다. 그래서 서비스마다 서버를 별도로 두고(최종으로는 k8s Pod로 구성할 계획) 세션 서버를 하나 두고 모든 서비스들이 이 세션 서버의 세션값을 사용하려고 합니다.

그런데, html과 자바스크립트가 있는 프론트 서버에서 로그인,유저정보 처리를 하는 백엔드 서버로 ajax 호출을 하면 세션에 저장된 정보를 가져오지 못하는 상황이 발생하고 있습니다.

서버 구성은 간략하게 그려보았습니다.

프론트 서버와 백엔드 서버는 세션을 모두 Redis 서버를 사용하기 위해 RedisHandler 로 설정하였고, SessionCookieName도 일치시켰고 SessionSavePath도 동일하게 Redis 서버 정보로 입력하였습니다. 그리고 cookieDomain 값도 도메인을 입력해야 되는 것으로 이해하여

.도메인.com 으로 입력하였습니다.

여기까지 진행하고 프론트앤드 서버에서 세션쿠키 값이 생성된 것을 Redis 서버에서도 입력 된 걸 확인 하고, 백엔드 서버를 호출하여 ID와 Password를 전달하니, 로그인이 되지 않았습니다.

확인해보니, 백엔드서버를 호출할 때마다 세션쿠키가 계속 생성되어 Redis 서버에 계속 쌓이고 있었습니다.

app/Controllers/BaseController.php 의 initController 함수에 

$this->session  = \Config\Services::session($config); 

이렇게 한 줄을 넣어 두었는데, 기존의 세션쿠키값을 못가져와서 그런거라는 생각이 듭니다.

혹시, Ajax 통신으로는 서버끼리 세션 공유가 불가할까요? 아니면, 다른 방법이 있을지 궁금합니다.

 

 

 다음글 CI DB세션 자동 만료 체크 (1)
 이전글 CI4 Debug툴때문에 오류가 나는 것 같습니다. (2)

댓글

windforce / 2022/11/11 09:46:18 / 추천 0
$config에 매번 다른 값이 들어있어서 그런건 아닌가요?
의붓집토토로 / 2022/11/11 10:29:00 / 추천 0

답글 감사합니다. $config 값을 출력해보니 null 이었네요... 그래서 바로 윗줄에 $config 를 추가했습니다.

$config = new \Config\App();
$this->session = \Config\Services::session($config);

그래도 동일하게 세션이 계속 Redis 서버에 생기는데, 브라우저에서 확인되는 세션쿠키 값과는 다른 세션쿠키값으로 생깁니다.

혹시 세션을 초기화 하면서 브라우저에서 가져 온 세션쿠키값으로 update 하는 방법이 있을까요?

변종원(웅파) / 2022/11/14 14:59:17 / 추천 0

프론트에서 로그인 했다면 백엔드서버에 세션을 전달하고 백엔드서버에서는 그 세션을 가지고 레디스에 질의하여 유효한 세션인지 체크해서 사용하는게 일반적인 형태입니다.

아이디, 비번을 백엔드에 전달해서 다시 로그인하면 당연히 새로운 세션이 생기는게 맞습니다. 중복 로그인 허용하도록 개발되어 있다면 모를까요.

마이크로 서비스의 개념부터 다시 보시는게 좋을 듯 합니다. ^^

의붓집토토로 / 2022/11/15 08:52:08 / 추천 0

원하는 방향으로 해결이 되었습니다.

쿠키도메인 값도 분명히 앞에 서브도메인으로 CORS 처리를 위해 . 을 붙여줬는데, 어떤 이유에서인지 적용되지 않는 상태였습니다.

브라우저에 저장되는 세션쿠키의 도메인이 아래의 그림과 같이 앞에 . 이 들어가야 백엔드로 세션쿠키값을 새로 생성하지 않고 보내는 것으로 확인 했습니다.

 

설정을 이것저것 많이 만지는 바람에 정확히 어떤 것 때문에 언제부터 . 이 들어가게 되었는지는 좀 더 검증해 봐야 겠지만, 일단 설정한 값을 나열해보자면

Ubuntu 20.04 LTS Apache2 의 /etc/apache2/sites-enabled/000-default.conf 파일에서 각 Virtualhost 마다 아래의 설정을 추가

Header set Access-Control-Allow-Origin "http://도메인.com"
Header set access-control-allow-credentials "true"

그리고 a2enmod headers 명령어로 모드 활성화

CI 4 app/Config/App.php 파일에서 값 수정

public $sessionCookieName = 'ci_sess_'; # 다른 백엔드 소스와 통일
public $cookieDomain = '.도메인.com';   # 다른 백엔드 소스와 통일
public $cookieSameSite = 'Lax';         # 서브도메인으로 요청하기 때문에 기본 Lax로 둠

 

위의 설정까지 했는데도 브라우저의 쿠키의 도메인값은 계속 .이 빠진 도메인.com 으로 저장되고 있어서

추가로, app/Config/Cookie.php 파일도 혹시 몰라서 아래와 같이 수정 했더니, .이 붙은 .도메인.com 으로 잘 저장 되었습니다.

public $domain = '.도메인.com';

 

왜 App.php 의 cookieDomain에 설정한 값이 반영되지 않고, Cookie.php의 도메인이 반영되는지가 의문이네요.

어쨌든 이렇게 되면 추후 k8s로 올리고 Pod가 늘어나도 세션이 잘 유지가 될 것 같습니다.