{"action":"created","issue":{"url":"https://api.github.com/repos/xpressengine/xe-core/issues/1613","labels_url":"https://api.github.com/repos/xpressengine/xe-core/issues/1613/labels{/name}","comments_url":"https://api.github.com/repos/xpressengine/xe-core/issues/1613/comments","events_url":"https://api.github.com/repos/xpressengine/xe-core/issues/1613/events","html_url":"https://github.com/xpressengine/xe-core/pull/1613","id":94205612,"number":1613,"title":"$_SESSION 제거 및 하위호환 보장하는 캐시 친화적인 세션관리","user":{"login":"wkpark","id":232347,"avatar_url":"https://avatars.githubusercontent.com/u/232347?v=3","gravatar_id":"","url":"https://api.github.com/users/wkpark","html_url":"https://github.com/wkpark","followers_url":"https://api.github.com/users/wkpark/followers","following_url":"https://api.github.com/users/wkpark/following{/other_user}","gists_url":"https://api.github.com/users/wkpark/gists{/gist_id}","starred_url":"https://api.github.com/users/wkpark/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wkpark/subscriptions","organizations_url":"https://api.github.com/users/wkpark/orgs","repos_url":"https://api.github.com/users/wkpark/repos","events_url":"https://api.github.com/users/wkpark/events{/privacy}","received_events_url":"https://api.github.com/users/wkpark/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":3,"created_at":"2015-07-10T03:40:59Z","updated_at":"2015-07-10T08:37:12Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/xpressengine/xe-core/pulls/1613","html_url":"https://github.com/xpressengine/xe-core/pull/1613","diff_url":"https://github.com/xpressengine/xe-core/pull/1613.diff","patch_url":"https://github.com/xpressengine/xe-core/pull/1613.patch"},"body":"#1598 에서 갈라져나왔습니다.\r\n\r\n`$_SESSION`을 당장에 제거하는 것은 여러모로 어려울 것입니다만,\r\n하위 호환을 보장하는 것은 크게 어렵지 않네요.\r\n애드온 파일을 직접 검사하여 `$_SESSION`을 사용하는 지 검사하게 하여 `session_start()`를 자동으로 호출하게 끔 바꿨습니다.\r\n\r\n이와 아울러, `$_SESSION`을 직접 엑세스하는 경우에는 세션이 어디서 잘못 쓰이고 있는지 추적하는 것 자체가 어렵기때문에, 라라벨 플레임워크를 참조하여 `SessionCookie`라는 클래스를 도입하였습니다.\r\n\r\n이제는 `$_SESSION['fooo'] = 'bar';` 라고 할 것이 아니라 `SessionCookie::set('fooo', 'bar')`라고 호출해야 합니다.\r\n\r\n거의 대부분의 `$_SESSION`을 직접 다루는 구문은 비교적 간단한 regex로 `SessionCookie::` 스타일로 변환을 하였고, 일부 파일에 대해서 수동으로 고쳐줬습니다.\r\n\r\n이렇게 하고나서 `$_SESSION`이 어디서 잘못 호출되거나, 쓸데없이 호출하고 있는지 찾았고, 그 부분에 대해 선택적으로 `session_start()` 호출되도록 하였습니다.\r\n\r\n* 세션이 시작된다 => `PHPSESSID` 쿠키가 자동 세팅 => `PHPSESSID`가 세팅되었을 경우 무조건 `session_start()` 호출됨\r\n* `PHPSESSID` 쿠키가 비어있고, 세션을 쓸 필요가 없는 경우 => `session_start()` 호출 안됨\r\n* 세션을 변수를 검사하는 경우 => `session_start()`가 호출이 안된 경우는 그냥 무시함\r\n* 세션 변수를 세팅하는 경우 => `session_start()` 호출되어 세션 자동 세팅 => `PHPSESSID` 쿠키 세팅\r\n\r\n- - -\r\n예전 방식의 애드온은 여전히 작동합니다. 위에 써있는 것처럼 애드온 설정이 바뀔때 애드온의 `$_SESSION` 변수를 간단히 검사하여 `session_start()`가 자동 호출되도록 하였습니다."},"comment":{"url":"https://api.github.com/repos/xpressengine/xe-core/issues/comments/120301308","html_url":"https://github.com/xpressengine/xe-core/pull/1613#issuecomment-120301308","issue_url":"https://api.github.com/repos/xpressengine/xe-core/issues/1613","id":120301308,"user":{"login":"wkpark","id":232347,"avatar_url":"https://avatars.githubusercontent.com/u/232347?v=3","gravatar_id":"","url":"https://api.github.com/users/wkpark","html_url":"https://github.com/wkpark","followers_url":"https://api.github.com/users/wkpark/followers","following_url":"https://api.github.com/users/wkpark/following{/other_user}","gists_url":"https://api.github.com/users/wkpark/gists{/gist_id}","starred_url":"https://api.github.com/users/wkpark/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wkpark/subscriptions","organizations_url":"https://api.github.com/users/wkpark/orgs","repos_url":"https://api.github.com/users/wkpark/repos","events_url":"https://api.github.com/users/wkpark/events{/privacy}","received_events_url":"https://api.github.com/users/wkpark/received_events","type":"User","site_admin":false},"created_at":"2015-07-10T08:37:12Z","updated_at":"2015-07-10T08:37:12Z","body":"1. 이 방법으로 모든 `$_SESSION`이 제대로 사용되고 있는지 추적할 수 있게 되었고 그것의 문제를 쉽게 고칠 수 있었습니다. 역으로 원래 방식대로 하고, 해당 문제를 고칠 수도 있게 되었죠.  자동으로 디텍트 하는 방식을 원래 방식에서도 그대로 적용 가능합니다.\r\n2. 다차원 배열을  다음과 같은 방식으로 지원합니다. 다행이 현재 core에는 복잡한게 없었지요. (라라벨방식)\r\n~~~\r\nSessionCookie::set(\"foo.bar.dot\", \"foobar\");\r\n$x = SessionCookie::get(\"foo.bar\");\r\n~~~\r\n이것은 `$_SESSION['foo']['bar']['dot']`을 세팅합니다. `get(\"foo.bar\")`는 `$_SESSION['foo']['bar']` 배열을 가져오지요.\r\n\r\n`$_SESSION['foo']['bar'][] = 'a';` 이것은 라라렐 세션의 경우 `push` 메쏘드를 지원합니다. 이를 지원하게 고치는 것도 쉽니다.\r\n\r\n이 방식을 써야만 장기적으로 `$_SESSION`에 의해서 캐시를 방해하는 부분을 쉽게 추적하고 걷어낼 수 있게 됩니다."}}