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

일회만 접속하는 세션을 쉽게 제거 #1113

Closed
textcube-dev opened this issue Sep 24, 2012 · 6 comments
Closed

일회만 접속하는 세션을 쉽게 제거 #1113

textcube-dev opened this issue Sep 24, 2012 · 6 comments

Comments

@textcube-dev
Copy link
Contributor

1. 제안 요약

현재 세션과 관련된 시각 필드는 두 개가 있습니다.
created, updated
두개 필드에 expired 를 하나 더 제안할까 합니다. 추후 expired 는 updated를 대치할 수도 있습니다.

2. 제안의 배경
세션이란 최초접속한 클라이언트마다 레코드가 하나 INSERT됩니다. 그리고, 다음 요청에 의해
UPDATE 가 일어나고
updated + $service['timeout'] < 현재시각 이라는 조건, 즉 timeout 동안 업데이트가 안일어나면
가비지 콜렉션 대상이 되어 DELETE 됩니다.

이때, 만약 1회성으로 접속하는 로보트나 세션 쿠키를 무시하는 로보트라면 updated는 갱신되지
않으므로 필요없는 세션 레코드가 생성이 됩니다.

3. 제안의 내용

최초 INSERT가 일어날때, updated = 현재시각 - $service['timeout'] + 1분 으로 합니다. 그리고
UPDATE 가 일어 날 때는 기존과 마찬가지로 updated = $service['timeout']으로 합니다.
이렇게 되면, 세션에 대한 개념없이 접근하는 로봇에 의한 세션들은 1분안에 사라지게 됩니다.
일반적인 브라우저는 두번째 호출이 항상 요청 되므로, 세션에는 건강한(?) 아이들만 존재하게 됩니다.
  • 이슈 등록시간: 2008-10-02T13:44:17
  • 마지막 수정시간: 2008-10-09T17:41:58
Comment 1 by coolengineer at 2008-10-02T14:21:17
25df02f
Comment 2 by lunamoth at 2008-10-06T21:08:13
* TNF 메일링으로 말씀 드렸던 문제 남겨봅니다.. * 25df02f 업데이트 후에 공백 페이지가 뜨고 디버그 모드에서 아래 에러 나오는 문제가 있는 것 같습니다.
Fatal error: Cannot redeclare newanonymoussession() (previously declared in /home/lunamoth/public_html/tc/lib/session.php:102) in /home/lunamoth/public_html/tc/lib/session.php on line 122
Comment 3 by inureyes at 2008-10-06T21:28:34
1295334

refs #1113

  • 버그 수정
Comment 4 by coolengineer at 2008-10-06T22:27:55
아... 감사 inureyes!
@ghost ghost assigned coolengineer Sep 24, 2012
@inureyes inureyes reopened this Jan 20, 2015
@inureyes inureyes modified the milestones: 2.0.0, 1.7.6 Jan 20, 2015
@inureyes
Copy link
Member

@coolengineer 동작 루틴을 한 번 확인해 보아야 할 것 같습니다. 어딘가 꼬인 것 같기도!

@coolengineer
Copy link
Contributor

제가 작성한 코드가 lib/session.php 시절 만들어진 것이고, 여기에서 timestamp 관련되어 살짝 변형된 코드가 Textcube.Control.Session.php 여기에 있군요. Textcube.Control.Session.php 파일 내에 있는 코드를 살펴보니 문제가 있어 보입니다. 만약 꼬인 것 같다면 이 안의 함수인 newAnonymousSession 이 문제군요. 이걸 고치는 걸로 하겠습니다.

@inureyes
Copy link
Member

@coolengineer 뭔가 세션 테이블이 항상 넘쳐나는 문제가 있습니다. 확인을 부탁 드립니다. T_T

@coolengineer
Copy link
Contributor

오늘 파고있고 밤 중에 푸시할게요~

나의 iPhone에서 보냄

      1. 오후 6:01 Jeongkyu Shin [email protected] 작성:

@coolengineer https://github.com/coolengineer 뭔가 세션 테이블이 항상 넘쳐나는 문제가
있습니다. 확인을 부탁 드립니다. T_T


Reply to this email directly or view it on GitHub
#1113 (comment).

@coolengineer
Copy link
Contributor

DB용 session 관리 모듈은 expires 로 만 gc를 수행합니다. 이 expires는 세션이 생길때 timeout(대략 3600초) 만큼 계산한 미래로 설정해 놓구요.

그런데 일회용 세션(60초 이내에 다시 세션에 대한 요청이 없을 것)을 바로 제거하는 것은 gc가 expires 값이 아닌 updated 필드가 현재로부터 timeout 시간 이전에 일어난 것을 대상으로 수행한다 가정하고 구현되었으며, 또한 세션에 대한 read 만으로 updated가 현재 값으로 갱신된다고 가정하고 만들었습니다.

따라서, 정상 작동을 위해서 expires를 사용하도록 수정하여야하며, 세션 read 시에 최초생성 이후 두번째인지를 확인하여 expires를 현재 시각 + timeout 으로 설정하는 루틴이 필요합니다.

  • 최초 생성시에 updated 값을 0으로 설정하고, expires 는 60초 뒤로 합니다.
  • 세션이 write 될 때 updated가 0이라면 updated 를 1로 만듭니다.
  • 최초 세션 read는 생성되고 바로 일어나므로 updated는 0으로 검출됩니다.
  • 두번째 세션 read는 updated = 1인 것을 확인하고 updated는 현재시각, expires 는 현재시각 + timeout으로 설정합니다.

inureyes added a commit that referenced this issue Jan 20, 2015
refs #1113 에 대한 수정입니다.
@inureyes
Copy link
Member

@coolengineer master는 한 사흘 돌려보니 문제가 없어졌네요~ 1.10 트리쪽도 확인이 필요할 듯 합니다. >_<

@inureyes inureyes closed this as completed Feb 8, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants