개발 기록/Tools & 기타

[PHP] 서브 도메인 간 세션 공유 방법

JasonM 2023. 5. 22. 10:32
반응형

다른 서브 도메인 간(www.url.com, shop.url.com등) 세션 공유 퍼온 글입니다.

 


안녕하세요.
제목을 보시면 알겠지만 전혀 다른 도메인 간은 아닙니다.

www.domain.com
chat.domain.com
shop.domain.com
mail.domain.com 등등
뒷부분은 같고 호스트 부분이 틀릴 때 세션을 공유하는 방법입니다.

일단, 쿠키와 세션에 대한 기본적인 이해부터 하겠습니다. 원리는 간단하니까요..

일단, 서버의 도메인이 www.domain.com 이라고 가정을 하겠습니다.


1. 쿠키

www.domain.com 에서 쿠키를 발행할 수 있는 최대범위는 .domain.com 입니다

 

다음처럼 하면

setCookie("logid","gagamel", 0, "/", ".domain.com");
setCookie("passwd","gozila", 0, "/", ".domain.com");


뒷부분이. domain.com으로 끌나는 서버(예를 들면 shop.domain.com)에서는 www.domain.com 에서 발행한 쿠키를 쓸 수 있게 되죠.

echo $logid; <-- 이렇게요....

하지만 쿠키는 중요정보가 모두 클라이언트 쪽으로 보내진다는데서 보안상 무척 좋지 않습니다.
그래서들 요즘에는 세션을 쓰죠...^^


2. 세션이란?

세션은 쿠키의 단점을 보완하고자 만들어졌습니다.
위의 예를 들자면

$logid = "gagamel";
$passwd = "gozila";
session_register("logid");
session_register("passwd");

이렇게 쓰겠죠.....


이럴때 실제로 세션은 어떻게 동작을 하는가.??

실제로 위의 logid 갈은 변수들의 값은 서버에 기록이 됩니다.
보통 설정에 파일로 기록이 되게 되어 있죠.


위치는?
물론 설정에 /tmp 밑에 저장이 되게 되어 있습니다.


그럼 파일이름은?
그건 php 가 그때그때 랜덤하게 유니크한 값을 만들어서 파일이름으로 씁니다..
sess_50fffa7e58f63c83ac0473fb928f17ed <-- 이런거
그리고 나서 이 파일이름을 클라이언트에게 쿠키로써 보내주게 되어있죠..


그럼 php 가 아래 같은 문장을 만나게 되면

echo $logid;


일단 쿠키로 발행한 그 파일이름은 이미 헤더정보로 클라이언트에게서 읽어온 상태입니다.
그리고 설정에서 정한 위치에 똑같은 파일이름이 있나 확인하고 있으면 거기에 있는 변수값을 읽어오는 거죠...
물론 파일이 없으면 누가 세션스푸핑을 한다거나 세션 만료시간으로 인해 파일이 없어졌다거나 한 거겠죠..

쉽죠..^^ 세션은 쿠키를 보안한 거지 전혀 새로운 개념은 아닙니다...


3. 세션공유

php.ini 에 보면 세션의 기본 설정은

  • session.save_handler = files ; 저장방식은 파일로 (db도 가능)
  • session.save_path = /tmp ; 위치는 /tmp
  • session.name = PHPSESSID ; 쿠키로 발행될 쿠키변수 이름
  • session.cookie_path = / ; 쿠키가 유효한 디렉토리
  • session.cookie_domain = ; 쿠키가 유효한 도메인인데 기본은 비어있습니다
  • 다른 건 생략

이렇게 되어 있습니다.

그래서 디폴트 상태로 세션을 쓰게 되면 쿠키로 발행된 세션의 파일이름은 현재의 도메인에만 먹게 되어 있죠.

여기서 두 가지만 바꾸어 주게되면 .domain.com 으로 끝나는 모든 서버에 세션이 먹게 됩니다..

session.save_path = /tmp ;
session.cookie_domain = .domain.com ;

일단 두 번째처럼 해주면 쿠키로 발행된 PHPSESSID 는 .domain.com 의 모든 서버에서 먹게 됩니다.

첫 번째는 실제 파일이 저장되어 있는 위치라고 말씀드렸죠..
만약 같은 서번데 도메인만 틀릴 경우에는 변경할 필요 없습니다.
그러나 서버가 틀리다면 문제가 있습니다.
이럴땐 nfs 등의 디렉토리 공유 방법을 써서 그쪽 디렉토리 이름으로 지정을 해 주셔야 합니다.
디렉토리 소유권은 nobody 로 해주고 권한은 700 정도로 해주면 됩니다.
이렇게 하면 세션은 공유가 되죠.

아님 nfs 등을 쓰기가 꺼림칙하면 세션을 아예 db로 저장을 해서 공유하는 방법이 있습니다..
이건 세션핸들러 등으로 검색하면 잘 설명되어 있습니다.

그걸 참조하세요.

 

 

 

반응형