Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

$_SESSION 제거 및 하위호환 보장하는 캐시 친화적인 세션관리 #1613

Closed
wants to merge 9 commits into from

Conversation

wkpark
Copy link
Contributor

@wkpark wkpark commented Jul 10, 2015

#1598 에서 갈라져나왔습니다.

$_SESSION을 당장에 제거하는 것은 여러모로 어려울 것입니다만,
하위 호환을 보장하는 것은 크게 어렵지 않네요.
애드온 파일을 직접 검사하여 $_SESSION을 사용하는 지 검사하게 하여 session_start()를 자동으로 호출하게 끔 바꿨습니다.

이와 아울러, $_SESSION을 직접 엑세스하는 경우에는 세션이 어디서 잘못 쓰이고 있는지 추적하는 것 자체가 어렵기때문에, 라라벨 플레임워크를 참조하여 SessionCookie라는 클래스를 도입하였습니다.

이제는 $_SESSION['fooo'] = 'bar'; 라고 할 것이 아니라 SessionCookie::set('fooo', 'bar')라고 호출해야 합니다.

거의 대부분의 $_SESSION을 직접 다루는 구문은 비교적 간단한 regex로 SessionCookie:: 스타일로 변환을 하였고, 일부 파일에 대해서 수동으로 고쳐줬습니다.

이렇게 하고나서 $_SESSION이 어디서 잘못 호출되거나, 쓸데없이 호출하고 있는지 찾았고, 그 부분에 대해 선택적으로 session_start() 호출되도록 하였습니다.

  • 세션이 시작된다 => PHPSESSID 쿠키가 자동 세팅 => PHPSESSID가 세팅되었을 경우 무조건 session_start() 호출됨
  • PHPSESSID 쿠키가 비어있고, 세션을 쓸 필요가 없는 경우 => session_start() 호출 안됨
  • 세션을 변수를 검사하는 경우 => session_start()가 호출이 안된 경우는 그냥 무시함
  • 세션 변수를 세팅하는 경우 => session_start() 호출되어 세션 자동 세팅 => PHPSESSID 쿠키 세팅

예전 방식의 애드온은 여전히 작동합니다. 위에 써있는 것처럼 애드온 설정이 바뀔때 애드온의 $_SESSION 변수를 간단히 검사하여 session_start()가 자동 호출되도록 하였습니다.

 * make cache friendly
 * make cache-control public/private conditionally
 * use session_start() conditionally
 * $_SESSION을 직접 사용하지 않고 Facede wrapper를 사용
 * 보다 손쉬운 디버깅/추적 가능
 * 세션 쿠키 사용의 최소화를 위한 밑작엄
 * 다중 배열 지원 (라라벨 Support/Arr.php 참고하고 가져옴)
 * getCompatSession(): 애드온 파일을 직접 검사하여 $_SESSION이 쓰이는지 검사하고 있으면 세션 시작함
 * autoFixupSession(): 애드온 파일이 $_SESSION을 사용하는 경우에 간단한 regex를 이용해 새 스타일로 자동 변환
@wkpark wkpark changed the title $_SESSION 제거 및 하위호환 보장하는 캐시 친화적인 방법 $_SESSION 제거 및 하위호환 보장하는 캐시 친화적인 세션관리 Jul 10, 2015
@kijin
Copy link
Contributor

kijin commented Jul 10, 2015

이제는 $_SESSION['fooo'] = 'bar'; 라고 할 것이 아니라 SessionCookie::set('fooo', 'bar')라고 호출해야 합니다.

애드온은 어찌어찌하여 호환성이 확보되었지만, 여전히 서드파티 모듈을 수정해야 한다는 뜻으로 들리는데요. 그렇다면 #1598 과 다른 점이 무엇인가요? 어차피 서드파티 모듈 수정을 요구할 바에는 차라리 init() 메소드에 한 줄만 일괄적으로 추가하면 되는 #1598 방식이 더 간단해 보입니다.

$_SESSION['foo']['bar'][] = 'baz'

이런 식으로 다차원 배열을 사용하거나,

if(isset($_SESSION['foo']['bar']) && in_array('baz', $_SESSION['foo']['bar']))

이런 식의 조건식을 사용하는 경우에는 정규식으로 변환하기도 훨씬 까다롭고요.

SessionCookie 클래스에 ArrayAccess, Iterator 등의 인터페이스를 적용하고 싱글턴 인스턴스를 생성하여 $_SESSION 초전역변수를 덮어쓴다면 기존의 서드파티 모듈에서 세션 사용을 시도하는 경우까지 감지할 수 있을지도...?

@YJSoft
Copy link
Contributor

YJSoft commented Jul 10, 2015

@wkpark

PHP Fatal error: Call to a member function set() on a non-object in /home/travis/build/xpressengine/xe-core/classes/session/SessionCookieHandler.class.php on line 155

오류가 발생합니다. https://travis-ci.org/xpressengine/xe-core/jobs/70327436 확인해주세요.

@wkpark
Copy link
Contributor Author

wkpark commented Jul 10, 2015

  1. 이 방법으로 모든 $_SESSION이 제대로 사용되고 있는지 추적할 수 있게 되었고 그것의 문제를 쉽게 고칠 수 있었습니다. 역으로 원래 방식대로 하고, 해당 문제를 고칠 수도 있게 되었죠. 자동으로 디텍트 하는 방식을 원래 방식에서도 그대로 적용 가능합니다.
  2. 다차원 배열을 다음과 같은 방식으로 지원합니다. 다행이 현재 core에는 복잡한게 없었지요. (라라벨방식)
SessionCookie::set("foo.bar.dot", "foobar");
$x = SessionCookie::get("foo.bar");

이것은 $_SESSION['foo']['bar']['dot']을 세팅합니다. get("foo.bar")$_SESSION['foo']['bar'] 배열을 가져오지요.

$_SESSION['foo']['bar'][] = 'a'; 이것은 라라렐 세션의 경우 push 메쏘드를 지원합니다. 이를 지원하게 고치는 것도 쉽니다.

if(isset($_SESSION['foo']['bar']) && in_array('baz', $_SESSION['foo']['bar']))

이건 다음과 같이 하면 됩니다. 코드상에서 다차원 배열을 쓰고 있는 부분이 있어서 이에 대한 지원도 같이 들어갔지요.

if(SessionCookie::has('foo.bar') && in_array('baz', SessionCookie::get('foo.bar')))

이 방식을 써야만 장기적으로 $_SESSION에 의해서 캐시를 방해하는 부분을 쉽게 추적하고 걷어낼 수 있게 됩니다.

@wkpark
Copy link
Contributor Author

wkpark commented Jul 10, 2015

SessionCookie 클래스에 ArrayAccess, Iterator 등의 인터페이스를 적용하고 싱글턴 인스턴스를 생성하여 $_SESSION 초전역변수를 덮어쓴다면 기존의 서드파티 모듈에서 세션 사용을 시도하는 경우까지 감지할 수 있을지도...?

음 이 부분은 좀 살펴봐야겠네요.

@wkpark
Copy link
Contributor Author

wkpark commented Jul 10, 2015

XE + VarnishCache 서버를 사용하고자 하시는 분들을 위해 간단한 설명서를 작성했습니다~
https://github.com/wkpark/xe-core/wiki/XeWithVarnishCache

@ghost ghost added the status/keep label Feb 1, 2017
@ghost ghost closed this Feb 1, 2017
This pull request was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants