2014-04-25 2 views
2

이해하기 : session_id, ip_addressuser_agent.CodeIgniter의 세션 테이블 구조

CREATE TABLE IF NOT EXISTS `ci_sessions` (
     session_id varchar(40) DEFAULT '0' NOT NULL, 
     ip_address varchar(45) DEFAULT '0' NOT NULL, 
     user_agent varchar(120) NOT NULL, 
     last_activity int(10) unsigned DEFAULT 0 NOT NULL, 
     user_data text NOT NULL, 
     PRIMARY KEY (session_id, ip_address, user_agent), 
     KEY `last_activity_idx` (`last_activity`) 
); 

최대한 많이 설명해주십시오. 또한이 구조를 개선하기위한 제안을 듣고 싶습니다. 인덱스가 아닌 ip_addressuser_agent primary_keys 인 이유는 무엇입니까? 차이점이 뭐야?

또 다른 정보로,이 표는 시스템에 대한 모든 사용자 액세스에 행을 추가하므로 매우 부풀어 오릅니다.

편집 : 마음에 떠오르는 또 다른 질문입니다. 사용자 에이전트와 일치하는 이유는 무엇입니까?

답변

2

여기에있는 아이디어는 각 세션이 고유해야한다는 것입니다. 그것은 세션을 어떻게 식별합니까? 기본 키의 세 값 : session_id, ip_addressuser_agent. 당신이 그것에 대해 생각하는 경우

이 의미가 있습니다 :

  1. session_id 변경 후 (분명히) 다른 (새로운) 세션을 처리하는 경우.
  2. ip_addess이 변경되면 누군가 다른 PC에서 로그인하는 것입니다. 이것은 새로운 세션이 될 것입니다.
  3. user_agent 값이 변경되면 누군가 다른 브라우저를 사용하고 있습니다. 다시 한 번 새로운 세션이됩니다. 하나 ip_address 또는 user_agent 단순히 session_id의 기존 행을 업데이트 변경 :

그래서에만 session_id 기본 키는 것을 상상한다. 이 경우, session_id 만 알면 다른 PC 나 다른 브라우저에서 동일한 세션을 계속 진행할 수 있으므로 보안 문제가 될 수 있습니다.

또한 "이 표는 모든 사용자의 시스템 액세스 권한에 행을 추가하므로 매우 부풀어 오릅니다."라고 썼습니다. 사용자 A가 시스템에 액세스 할 때마다 행을 추가 할 때마다 (즉, 응용 프로그램에서 false이고 방금 테스트했습니다) 또는 시스템에 액세스하는 각 사용자의 행을 추가한다는 것을 의미하는지 확실하지 않습니다 (이는 사실입니다). , 그리고 그것이 작동하도록되어있는 방식 - 시스템을 사용하는 각 사용자는 세션을가집니다. 어쩌면 당신은 그 마지막 코멘트를 명확히 할 수 있습니다.

+0

예, 모든 다른 사용자는 행을가집니다. 또한, 가비지 수집 된 이전 세션 데이터 인 또 다른 행이 있습니다. – enapupe

+0

그래서 내 응용 프로그램에서 IP_ADDRESS와 일치하지 않는다고 결정하면 PK에서 제거해야합니까? – enapupe

+0

많은 사용자가 자주 변경되는 동적 IP 주소를 가지고 있기 때문에 모뎀이 다시 동기화 될 때 재부팅됩니다. 그래서 나는 보통 IP_ADDRESS와 비교하여 세션을 일치시키지 않습니다. 그것은 많은 웹 사이트들이하는 일입니다. 페이 스북, 구글 .. – enapupe

1

"기본 키"는 모순입니다. 테이블에는 하나 이상의 "기본 키"가있을 수 없습니다. 기록 된대로 기본 키가 하나만 있습니다. COMPOSITE 키에는 3 개의 개별 필드가 있습니다. IP와 세션 ID 번호가 중복 된 경우에도

(42, 127.0.0.1, "Chrome") 
(42, 127.0.0.1, "Firefox") 

최대한 멀리 CI에 관한 한 두 개의 전혀 다른 세션 의미

. 3 방향 튜플은 고유하지만 개별 구성 요소를 복제 할 수 있습니다.

+0

사용자 에이전트에 대한 질문을 편집했습니다. 귀하의 답변에 감사드립니다. – enapupe