CI 묻고 답하기

제목 세션 공유에 대해서 여쭙니다.
카테고리 CI 2, 3
글쓴이 뫄뫄잉뿌 작성시각 2017/12/08 15:24:47
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 27124   RSS

http://www.codeigniter-kr.org/bbs/view/etc_qna?idx=18372&page=1&view_category=&lists_style=

 

현재 서브도메인과 메인도메인을 각각 다른 홈페이지로 구성하고,

이 두 도메인에서 서브도메인에 로그인한 정보를 메인도메인에서 쓰려고 합니다.

위의 링크를 참고해서 user_id를 추가시키고, ci_sessions DB를 통해서 하려고하는데

메인 도메인은 회사 메인 홈페이지, 서브 도메인은 회사의 인트라넷이라 

ci_sessions의 ip_address 필드의 값이 모두 사내 IP로 같습니다.

각각의 사원들에 대해서 timestamp가 만약 같게 되어도 id 값은 다른가요?

또, user_id를 this->session->userdata('user_id')로 넣으려고 하는데,

그럼 내부적인 절차로는 로그인으로 세션을 생성 후 시스템 세션이 돌아가는건가요?

 

http://www.ciboard.co.kr/user_guide/kr/libraries/sessions.html

세션에 대한 설명은 아직 번역이 덜 되었나봐요 ㅜㅜ 

세션 유지 시간은 근무 시간 내내 적용시켜야되서 session_expiration 은 0으로, sess_time_to_update 를 0으로 잡았는데,

이렇게 되면 한 유저가 로그인 했을 때 세션 id 값은 브라우저가 닫히기 전까지는 같은 id 가 맞는건가요?

 다음글 이미지경로 설정 질문입니다. (5)
 이전글 이메일 보내기 메일이 안와요????? 무슨 문제인지 알... (6)

댓글

변종원(웅파) / 2017/12/08 15:46:39 / 추천 0

질문을 다시 정리하셔야 할 것 같네요.

timestamp와 id는 연관이 없습니다. (서브도메인 세션 공유에서) 살아있는지 체크하고 세션을 갱신하는데 사용됩니다. 

https://www.google.com/search?q=codeigniter+%EC%84%9C%EB%B8%8C%EB%8F%84%EB%A9%94%EC%9D%B8+%EC%84%B8%EC%85%98%EA%B3%B5%EC%9C%A0&oq=codeigniter+%EC%84%9C%EB%B8%8C%EB%8F%84%EB%A9%94%EC%9D%B8+%EC%84%B8%EC%85%98%EA%B3%B5%EC%9C%A0&aqs=chrome..69i57.11141j0j7&sourceid=chrome&ie=UTF-8

뫄뫄잉뿌 / 2017/12/11 13:41:06 / 추천 0

@변종원(웅파)님

답변 감사합니다! ci_session을 쿠키로 저장해서 공유하는건 성공했습니다.

http://www.ciboard.co.kr/user_guide/kr/libraries/sessions.html 요 링크를 참고하면서 보고 있는데, 

로그인 시, cookie로 ci_session값이 저장이 되는데 로그아웃때는 ci_session 쿠키값을 삭제 하지 않고 있는데 혹시 이유가 있는 건가요?

시크릿 창으로 세션, 쿠키값 보니까 처음엔 아무 것도 없다가, 로그인 하고 세션값, 쿠키 ci_session 값이 생성된 후에 로그아웃을 하면 세션은 비어있는데 ci_session 쿠키값은 기존 값 그대로 유지가 됩니다.

혹시 제가 cookie_lifetime 설정을 7200로 두어서 그럴까요.. ㅜㅜ

delete_cookie('ci_session'); 이렇게 해도 계속 유지가 되는데 제가 용도를 잘못생각한건가요..?

변종원(웅파) / 2017/12/11 13:45:25 / 추천 0

빈 쿠키는 아무런 의미가 없죠. ^^

세션 쿠키라는 방식이라 좀 다릅니다. 사용자정의 값(아이디, 로그인 여부 등)은 서버의 세션에 저장이 되고

쿠키가 사용자pc에 생성됩니다. 쿠키아이디가 세션의 키가 되구요. 쿠키키(세션키)만 있고  user_data는 비어 있는 세션은

빈 세션과 동일하기 때문에 있으나 없으나 똑같습니다.

뫄뫄잉뿌 / 2017/12/11 13:56:09 / 추천 0

@변종원(웅파)님

빠른 답변 감사합니다!!

그럼 쿠키키(세션키)가 공유가 되어도 세션은 공유가 안되서 쿠키키로는 세션정보를 가져올 수 없고, 가지고 온 쿠키키로 DB에 저장되어 있는 정보를 가져와서 처리해야한다는 말씀이신거죠?

그럼 로그아웃을 했을 때 쿠키키(세션키)가 있어도 로그아웃 한 페이지에서는 세션이 비어있는 것이 맞고, 다른 공유 홈페이지에서는 로그아웃을 했다는 것을 어떻게 알아야 하나요..?

변종원(웅파) / 2017/12/11 14:32:14 / 추천 0
로그인 여부는 세션(db)에 데이터가 있는지 여부니까 개발자가 알수있죠.
뫄뫄잉뿌 / 2017/12/11 15:05:20 / 추천 0

@변종원(웅파)님

답변 감사합니다!!

로그아웃을 하면 data필드가 비어있군용 ㅎㅎ 감사합니다! 

tuyitu719 / 2026/03/14 11:07:02 / 추천 0

질문하신 경우에는 ip_addresstimestamp보다 id가 세션을 구분하는 핵심값입니다. CodeIgniter 세션 문서의 DB 드라이버 예시에서도 ci_sessions 테이블은 id, ip_address, timestamp, data로 구성되고, 기본키도 sess_match_ip=FALSE이면 id, TRUE이면 (id, ip_address)로 잡도록 안내합니다. 그래서 사내 IP가 전부 같아도 세션은 보통 id로 구분되고, timestamp가 우연히 같아져도 같은 세션이 되는 것은 아닙니다.

user_id$this->session->userdata('user_id')로 쓰는 흐름은 맞습니다. 세션 라이브러리는 요청이 들어올 때 세션 쿠키를 확인하고, 없거나 만료되었으면 새 세션을 만들고, 유효한 세션이 있으면 자동으로 읽고 업데이트합니다. 그리고 로그인 후 set_userdata()로 넣은 값은 그 세션 데이터에 붙어서 이후 요청에서 userdata('user_id')로 꺼내 쓰는 구조입니다. 즉, 말씀하신 대로 로그인으로 세션이 생성/확인된 뒤, 그 세션 안에 user_id 같은 사용자 데이터를 얹어서 계속 쓰는 방식으로 이해하시면 됩니다.

다만 메인 도메인과 서브도메인에서 같은 로그인 상태를 truly 공유하려면, 같은 부모 도메인 아래라는 전제에서 세션 쿠키가 양쪽에 모두 전달되어야 합니다. CI 문서에서도 cookie_domain은 “세션 쿠키가 적용될 도메인”이라고 설명하고 있고, 일반 쿠키 규칙상 Domain을 상위 도메인으로 지정하면 그 도메인과 하위 서브도메인들에 쿠키가 전달됩니다. 그래서 보통은 양쪽 앱에서 sess_cookie_name, cookie_domain, cookie_path, 세션 저장소 설정을 같게 맞춰야 공유가 됩니다. 예를 들면 example.comintra.example.com을 같이 쓰려면 cookie_domain을 상위 도메인 기준으로 맞추는 방식입니다.

$config['sess_expiration'] = 0; 의 의미는 **“영구 세션”이 아니라 “브라우저를 닫을 때까지 유지”**입니다. CI 문서도 0이면 non-expiring session, 즉 브라우저가 닫힐 때까지로 설명합니다. 브라우저가 살아 있는 동안은 계속 유지되지만, 완전히 영구 보존과는 다릅니다.

그리고 $config['sess_time_to_update'] = 0;세션 ID 재생성을 끄는 설정입니다. 문서에 그대로 “0으로 설정하면 session ID regeneration을 비활성화한다”고 되어 있습니다. 따라서 이 값을 0으로 두면, 로그아웃/세션 삭제/브라우저 종료 같은 이벤트가 없는 한 같은 브라우저 세션 동안 같은 session id를 계속 유지하는 방향이 맞습니다. 다만 이건 보안상 세션 고정(session fixation) 측면에서 덜 안전할 수 있어서, 실무에서는 아예 0으로 끄기보다 업무 시간에 맞춰 sess_expiration을 길게 두고 sess_time_to_update는 적당히 유지하는 쪽을 더 많이 씁니다.

게시판 답변용으로는 이렇게 쓰면 자연스럽습니다.


 
 
질문하신 경우에는 ip_address 나 timestamp 보다
세션의 id 값이 실제 구분 기준이라고 보시면 됩니다.

즉, 사내망이라서 ip_address 가 모두 같더라도
세션은 id 로 구분되므로
timestamp 가 같다고 해서 같은 세션이 되는 것은 아닙니다.

그리고 user_id 를
$this->session->userdata('user_id')
로 사용하는 방식도 맞습니다.

로그인 후 set_userdata() 등으로 user_id 를 세션에 저장해두면,
그 뒤에는 CI Session 이 요청마다 자동으로 세션을 읽고 유지하면서
userdata('user_id') 로 꺼내 쓰게 됩니다.

다만 메인도메인과 서브도메인에서 같은 세션을 쓰려면
단순히 DB만 같다고 되는 것이 아니라
양쪽에서 session cookie 를 같이 읽을 수 있어야 합니다.

즉,
- sess_cookie_name
- cookie_domain
- cookie_path
- 세션 저장 방식(DB 테이블 등)

이 값들이 같이 맞아야 합니다.

또한
$config['sess_expiration'] = 0;
은 무한 유지라기보다
브라우저를 닫을 때까지 유지의 의미이고,

$config['sess_time_to_update'] = 0;
은 session id 재생성을 끄는 것이므로
브라우저를 닫기 전까지 같은 session id 를 유지하는 방향이 맞습니다.

다만 보안상 session id 재생성을 완전히 꺼두는 것은
조금 주의가 필요하므로,
업무시간 동안 유지가 목적이면 expiration 을 길게 주고
time_to_update 는 너무 짧지 않게 조정하는 방법도 고려해보시는 게 좋습니다.