Skip to content

로그인시 및 주기적으로 세션 식별자 교체해 주기#1245

Closed
kijin wants to merge 1 commit into
xpressengine:developfrom
kijin:feature/session-refresh
Closed

로그인시 및 주기적으로 세션 식별자 교체해 주기#1245
kijin wants to merge 1 commit into
xpressengine:developfrom
kijin:feature/session-refresh

Conversation

@kijin

@kijin kijin commented Feb 8, 2015

Copy link
Copy Markdown
Contributor

우연히 XE 코드베이스를 대상으로 session_regenerate_id()를 검색해 보았는데 단 1개의 검색 결과도 나오지 않더군요. 실제 테스트해 보아도 로그인 전후에 세션 식별자가 바뀌지 않아서, 로그인 전에 누군가가 세션 식별자를 탈취할 경우 로그인 후에도 계속 사용할 수 있겠고요.

그래서 세션 식별자를 기본 10분 간격 + 로그인 및 회원정보 변경시 추가로 교체해 주도록 하는 코드를 작성해 보았습니다. 물론 로그인 상태는 계속 유지됩니다. (로그아웃 및 탈퇴시에는 이미 session_destroy()를 해주고 있으므로 상관없습니다.)

일반적인 환경에서는 아무 문제도 발생하지 않는 것 같지만, 혹시 SSO처럼 특별한 환경에서 XE를 사용하거나 세션DB를 다른 프로그램과 공유하는 경우 문제가 발생할지도 모르겠습니다. 테스트 부탁드리고, 혹시 과거에 어떤 이유론가 세션 식별자를 교체하지 않기로 결정한 적이 있다면 그 이유가 아직 유효한지 가르쳐 주시면 감사하겠습니다.

@kijin kijin changed the title 로그인시 및 주기적으로 세션 식별자를 교체해 주기 로그인시 및 주기적으로 세션 식별자 교체해 주기 Feb 8, 2015
@YJSoft

YJSoft commented Feb 8, 2015

Copy link
Copy Markdown
Contributor

@kijin https://github.com/xpressengine/xe-core/releases/tag/1.7.7.2 1.7.7.2 릴리즈 노트 참고 부탁드립니다. 1.7.6에서 추가되었었으나 IE에서 세션 아이디 갱신이 안되는 경우가 있고, 가상 사이트에서 문제가 있어 1.7.7.2에서 제거된 부분입니다.

@kijin

kijin commented Feb 8, 2015

Copy link
Copy Markdown
Contributor Author

@YJSoft 아, 그런 일이 있었군요. #952, #980 말씀하시는 거죠?

인터넷진흥원에서 알려주신 보안취약점이었는데, 일부 환경의 문제 때문에 서둘러 제거해 버린 것 같네요. 혹시 정확히 어떤 부분이 문제였는지 기억하시는 분이 계시면, 같은 문제가 생기지 않는 방향으로 고쳐보겠습니다. 좀 시간이 걸리더라도 괜찮지만, 그냥 묻어버리기엔 중요한 문제라서요.

@izuzero

izuzero commented Feb 8, 2015

Copy link
Copy Markdown
Contributor

IE8에서 session_regenerate_id 함수 사용 시 세션 쿠키를 잃어버리는 문제 해결 방법 링크

  1. 현재 세션 데이터를 임의의 변수에 저장하고 수동으로 세션 아이디를 지정해준 다음 세션을 다시 시작해 세션 데이터를 복구하거나
  2. 링크의 댓글에 달린 것처럼 session_regenerate_id 함수를 실행하고 수동으로 세션 쿠키를 저장시켜줄 것

이 방법 테스트해줄 분 없을까요?

@kijin

kijin commented Feb 8, 2015

Copy link
Copy Markdown
Contributor Author

@izuzero 님 링크를 보니 IE8 버그는 큰 어려움 없이 우회가 가능할 것 같습니다. IE8일 경우 다른 방식을 써주면 되니까요. 더욱 안전을 기하기 위해 POST (컨트롤러) 요청 도중에는 세션 식별자를 변경하지 않고, 그 다음 정상적인 GET (뷰) 요청시에 변경하도록 예약하는 방법을 쓸 수도 있겠고요. 그러나 IE8도 다 그런 것이 아니라 어떤 컴퓨터에서만 버그가 생긴다고 하니, 버그 있는 컴퓨터를 찾는 것이 일이군요 ㅠ

이제 보니 업로더 쪽에서도 문제가 발생할 수 있겠군요. swfupload가 세션 처리를 제대로 못해줘서... #1086 에서 논의하고 있는 업로더 교체가 현실이 된다면 세션 문제도 훨씬 간단해지지 않을까 합니다. (그때까지 기다려드릴 수 있습니다 ^^)

가상 사이트나 SSO 사용시 발생할 수 있는 문제에 대비하여, 1.7.6에서처럼 덜컥 기본으로 적용해버리지 말고 사용자가 원하는 경우에만 세션 보안을 강화하도록 옵션으로 제공하는 방법도 있겠네요. 아예 이 애드온처럼 세션 식별자는 그대로 두고 다른 쿠키를 사용해서 보안을 향상시키는 방법도 있겠고요.

@kijin

kijin commented Feb 10, 2015

Copy link
Copy Markdown
Contributor Author

IE8 세션망각 버그는 session_regenerate_id()뿐만 아니라 Context::close()에서 session_write_close()를 해주는 부분과도 관련이 있을지 모르겠네요. 이런 함수를 호출할 때마다 PHPSESSID 쿠키가 중복으로 생성된다고 합니다. IE8 버그도 쿠키 중복시 두번째 이후를 무시한다는 점이 핵심이고요.

불행히 PHP 개발팀에서는 "not a bug", "won't fix" 등의 반응으로 일관하고 있습니다.

@kijin

kijin commented Feb 10, 2015

Copy link
Copy Markdown
Contributor Author

일단 손쉬운 배포와 폭넓은 테스트를 위해 애드온으로 방향을 전환했습니다. IE8 버그와 업로더 문제 때문에 상당히 복잡해지는 코드를 Context::init()에 모두 구겨넣기도 좀 그렇고요.

어쨌든 단순한 편의기능이 아니라 보안 취약점과 직결될 수 있는 문제인 만큼, 써드파티 애드온에 의존하기보다는 언젠가 코어에 흡수되어야 할 기능이라고 생각합니다. 애드온의 형태로 일단 안정화를 거친 후, 정리해서 코어에 흡수시킬 수 있으면 좋겠습니다. (그래서 PR은 계속 열어두겠습니다 ^^)

@ghost ghost self-assigned this Feb 10, 2015
@izuzero

izuzero commented Feb 10, 2015

Copy link
Copy Markdown
Contributor

블랙베리도 같은 문제가 생기는군요. 처음 알았습니다.
이 버그가 꽤 오래된 걸로 알고 있는데 나쁜 PHP 개발팀!

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