tomcat 클러스터링 설정 시 시큐리티 세션 복제 문의

2,610 views
Skip to first unread message

namkyu Lee

unread,
Apr 18, 2012, 10:09:08 PM4/18/12
to ks...@googlegroups.com
웹 사이트 중복 로그인 방지에 대하여 여쭙고자 글 올립니다.

현재 1번 장비, 2번 장비의 tomcat이 클러스터링으로 묶여 있고, 정상적으로 세션 공유가 이뤄지는 것을 확인하였습니다.

사용자가 1번에서 로그인 시 2번 장비로 복제된 세션을 넘길 때 시큐리티에서 event를 catch하지 못하는 것 같습니다만, 
시큐리티는 복제된 세션을 받을 수 있는 방법이 없는 건가요?






Sungchul Park

unread,
Apr 19, 2012, 11:29:53 AM4/19/12
to ks...@googlegroups.com
죄송합니다. 문제를 잘 이해 못하겠습니다.

어떤 이벤트 말인가요?
이벤트를 잡아내지 못하는 서버가 1번인가요? 2번인가요?
왜 복제된 세션을 넘길 때 문제가 생긴다고 판단하셨나요?

정상적이라면 1번에서 로그인이 정상으로 끝나면 그 상태가 (언젠가) 자동으
로 2번으로 복제되고 사용자가 2번 서버에서 접속해도 로그인된 상태로 사용
하게 되는 건데 말이죠.

12. 4. 19. 오전 11:09, namkyu Lee 쓴 글:

> --
> Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이
> 전송되었습니다.
> 웹에서 이 토론을 보려면
> https://groups.google.com/d/msg/ksug/-/WNjx71U76goJ을 (를) 방문하세요.
> 이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
> 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내
> 주세요.
> 더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그
> 룹을 방문하세요.

황용대

unread,
Apr 19, 2012, 11:56:23 AM4/19/12
to ks...@googlegroups.com
세션이 복제된다 함은 하나의 세션키를 가지고 1, 2번 서버에서 동일한 세션 객체를 가져올 수 있다는 말인데요

세션을 가지고 인증을 처리하는 스프링 시큐리티의 경우 세션 복제 이벤트 같은건 아무런 관계가 없습니다.

요청이 들어올 때 시큐리티 필터는 세션을 가져와서 세션에 시큐리티 컨텍스트가 들어있고 컨텍스트 안의 값이 로그인 된 상태이면 끝입니다.


2012. 4. 20. 오전 12:30 Sungchul Park <gyu...@gmail.com> 작성:

SeungChul Lee

unread,
Apr 22, 2012, 8:48:08 PM4/22/12
to ks...@googlegroups.com
사용자 정보를 담고 있는 class가 serializable하지 않은 것 아닌가요?
세션이 복제된다고 하더라도 세션에 담긴 객체의 class가 serializable하지 않다면 다른 객체로 인식하게 됩니다.
사용자 정보를 담는 class를 확인해 보세요.


2012년 4월 19일 목요일 오전 11시 9분 8초 UTC+9, namkyu Lee 님의 말:

김성국

unread,
Apr 24, 2012, 7:24:16 AM4/24/12
to ks...@googlegroups.com
저의 경우도 Resin WAS를 쓰면서 Database Session Clustering을 구현할때...

세션에 Object를 저장하고자 할경우 반드시(!) implement Serializable 를 해야만 했습니다.

PKI인증시 오브젝트를 세션에 저장했는데.. 뽑아보니 자꾸 null이 튀어나오는 바람에 애좀 먹었던 기억이 있구요..

지원센타에 요청했더니 지원계획 없다고 해서 디컴파일해서 해당 개체에 인터페이스만 붙혀서 다시 컴파일 한 기억이 있네요..


의외로 이런경우도 있답니다...  세션에 로그인 저장하는 UserDetails 를 구현한 구현체가 정말로 세션에 저장되는지 확인해보는것도 중요할 거 같네요...


여담이지만... ISO7레이어에 보면.. 세션계층과 어플리케이션 계층은 엄연히 틀리다죠....

-----------------------------------
sungko...@gmail.com
010-3339-1286
김 성국
-----------------------------------

황용대

unread,
Apr 24, 2012, 7:26:21 AM4/24/12
to ks...@googlegroups.com
그냥 상속 받아서 시리얼라이즈 임플리먼트 하면 안 됐을까요?

2012. 4. 24. 오후 8:24 "김성국" <sungko...@gmail.com> 작성:

--

김성국

unread,
Apr 24, 2012, 7:36:28 AM4/24/12
to ks...@googlegroups.com
그냥 상속 받아서 시리얼라이즈 임플리먼트 하면 안 됐을까요?


도메인 계층이라는게.... 그렇게 해결하기에 어려움이 있죠...

public B extends A implement Seri~~~ 로 사용할 경우...

A 클래스를 이용하는 모든 클래스에 전부 B 클래스를 사용하도록 변경을 해야 하는 상황이죠...

가뜩이나.. PKI모듈들은 네이티브 C로 만들어진 리소스도 연결해서 사용하고... 
배보다 배꼽이 더 커지는 만큼...
그나마 제일 단순해서 디컴파일에 컴파일이 쉬운 모델 클래스만 작업해서 마무리했었습니다.

모든 클래스들이 Inserface를 사용하도록 되어있었다면.. 
당연히 그렇게 했겠지만, 그런건 전혀 고려하질 안았더군요.. (어디더라... 곤 말 안할께요... )

처음엔 스프링 쓰면서 스프링이 하래서 인터페이스를 사용하는 식이였는데...
정말 인터페이스를 통한 구현이 얼마나 중요한지를 느끼게 해주었던 일이였습니다.

뭐.. 이미 3년이나 전에 일이라서.... 그때 제  실력이 지금보다도 훨씬 떨어질때였기도 하구요.. (지금도 별반 차이는 없지만.. ^^)

KwonNam Son

unread,
Apr 24, 2012, 10:16:16 PM4/24/12
to ks...@googlegroups.com
클러스터링시 Listener의 세션 생성 이벤트 감지 문제는 Tomcat의 클러스터링 관련 옵션을 조정해야 하는 것 같습니다.

스프링 시큐리티는 Listener가 세션 생성 이벤트를 감지해서 중복 로그인을 검사할 것 입니다.

http://tomcat.apache.org/tomcat-6.0-doc/config/cluster-manager.html 에서 notifyListenersOnReplication 옵션을 보시면 클러스터링 상태에서 세션 생성 이벤트가 발생하면 모든 리스너에 이벤트를 전파하는 것 같네요.

저 옵션을 사용해보시기 바랍니다.

기왕이면 적용 후 결과도 공유해주시면 감사하겠습니다.


2012년 4월 24일 오후 8:36, 김성국 <sungko...@gmail.com>님의 말:

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.



--
* 까먹지말자! http://kwon37xi.egloos.com

namkyu Lee

unread,
Apr 26, 2012, 2:17:12 AM4/26/12
to ks...@googlegroups.com
질문에 오해의 소지가있네요.
다시 정리를 하면 세션 클러스터링은 잘동작합니다. 
다만 문제가 발생한부분은 하나의 아이디로 중복로그인을 허용하지 않기 위해 
<sec:concurrent-session-control max-sessions="1" expired-url="/" exception-if-maximum-exceeded="false" session-registry-ref="sessionRegistryImpl"/> 를 설정했는데
동일한 UserName에 대해 이전 세션이 존재하는경우 이전 session 을 expired 시켜야 하는데정상적으로 expire가 되지 않습니다.

제가 추측 한 부분인데 session-registry-ref="sessionRegistryImpl" 설정을 추가해 sessionRegistryImpl 객체로 부터 getAllSessions 메서드를 이용해서 이전세션중에 동일한 아이디로 로그인된 Session이 있는지 찾으려고 했으나 세션 클러스터링이된경우에는 조회 안되어서
(# 처리하려고 하는 기능이 사용자가 로그인을 시도할경우 동일한 아이디로 이전 세션이 존재할경우 이전 세션을 끊고 들어갈건지, 아니면 이전세션을 유지하고 로그인을 하지 않을건지 이부분을 추가 하려고 합니다.)

security에서 event를 받지 못한다고 생각한 질문이었습니다. 
로그를 보면 sessionResitryImpl 의 registerNewSession 이벤트를 받은 장비에서만 해당 session 정보를 찾을수 있고 클러스터링 된 장비에서는 조회가 되지 않습니다.
제가 접근 방법이 잘못된것인지 궁금합니다. 

고수님들의 도움이 절실할때입니다. ^^

그리고 위에서 Serializable 구현을 안해서일수도 있다고 하셨는데 기본적으로 UserDetails를 구현하고 있음으로 직렬화 문제는 아닌것 같습니다.

추가로 클러스터링 설정에서 Manager 의 notifyListenersOnReplication  옵션은 true로 테스트 했습니다.

감사합니다.

2012년 4월 25일 오전 11:16, KwonNam Son <kwon...@gmail.com>님의 말:

황용대

unread,
Apr 26, 2012, 2:45:07 AM4/26/12
to ks...@googlegroups.com
��Ĺ�� ���� Ŭ�����͸� ���� ��ij���� �̿��� ������ �����ϴ� ����� ����?
���� ������Ʈ���� ���������� �� ����߾���ϴ�.
http://code.google.com/p/memcached-session-manager/

2012�� 04�� 26�� 15:17, namkyu Lee �� ��:
�� ������ �������ֳ׿�.
�ٽ� ������ �ϸ� ���� Ŭ�����͸��� �ߵ����մϴ�. 
�ٸ� ������ �߻��Ѻκ��� �ϳ��� ���̵�� �ߺ��α����� ������� �ʱ� ���� 
<sec:concurrent-session-control max-sessions="1" expired-url="/" exception-if-maximum-exceeded="false" session-registry-ref="sessionRegistryImpl"/> �� �����ߴµ�
������ UserName�� ���� ���� ������ �����ϴ°�� ���� session �� expired ���Ѿ� �ϴµ����������� expire�� ���� �ʽ��ϴ�.

���� ���� �� �κ��ε� session-registry-ref="sessionRegistryImpl" ������ �߰��� sessionRegistryImpl ��ü�� ���� getAllSessions �޼��带 �̿��ؼ� ������߿� ������ ���̵�� �α��ε� Session�� �ִ��� ã������ ������ ���� Ŭ�����͸��̵Ȱ�쿡�� ��ȸ �ȵǾ
(# ó���Ϸ��� �ϴ� ����� ����ڰ� �α����� �õ��Ұ�� ������ ���̵�� ���� ������ �����Ұ�� ���� ������ ���� ������, �ƴϸ� ������� �����ϰ� �α����� ���� �������� �̺κ��� �߰� �Ϸ��� �մϴ�.)

security���� event�� ���� ���Ѵٰ� ���� ���̾���ϴ�. 
�α׸� ���� sessionResitryImpl �� registerNewSession �̺�Ʈ�� ���� ��񿡼��� �ش� session ������ ã���� �ְ� Ŭ�����͸� �� ��񿡼��� ��ȸ�� ���� �ʽ��ϴ�.
���� ���� ����� �߸�Ȱ����� �ñ��մϴ�. 

����Ե��� ������ ����Ҷ��Դϴ�. ^^

�׸��� ������ Serializable ������ ���ؼ��ϼ��� �ִٰ� �ϼ̴µ� �⺻������ UserDetails�� �����ϰ� �������� ����ȭ ������ �ƴѰ� �����ϴ�.

�߰��� Ŭ�����͸� �������� Manager �� notifyListenersOnReplication  �ɼ��� true�� �׽�Ʈ �߽��ϴ�.

�����մϴ�.

2012�� 4�� 25�� ���� 11:16, KwonNam Son <kwon...@gmail.com>�� �� ��:
Ŭ�����͸��� Listener�� ���� �� �̺�Ʈ ���� ������ Tomcat�� Ŭ�����͸� ��� �ɼ��� �����ؾ� �ϴ� �� �����ϴ�.

������ ��ť��Ƽ�� Listener�� ���� �� �̺�Ʈ�� �����ؼ� �ߺ� �α����� �˻��� �� �Դϴ�.

http://tomcat.apache.org/tomcat-6.0-doc/config/cluster-manager.html ���� notifyListenersOnReplication �ɼ��� ���ø� Ŭ�����͸� ���¿��� ���� �� �̺�Ʈ�� �߻��ϸ� ��� �����ʿ� �̺�Ʈ�� �����ϴ� �� ���׿�.

�� �ɼ��� ����غ��ñ� �ٶ�ϴ�.

����̸� ��� �� ��� �������ֽø� �����ϰڽ��ϴ�.


2012�� 4�� 24�� ���� 8:36, �輺�� <sungko...@gmail.com>�� �� ��:

�׳� ��� �޾Ƽ� �ø�������� ���ø���Ʈ �ϸ� �� �������?


������ �����̶�°�.... �׷��� �ذ��ϱ⿡ ������� ����...

public B extends A implement Seri~~~ �� ����� ���...

A Ŭ������ �̿��ϴ� ��� Ŭ������ ��� B Ŭ������ ����ϵ��� ������ �ؾ� �ϴ� ��Ȳ����...

�����̳�.. PKI������ ����Ƽ�� C�� ������� ���ҽ��� �����ؼ� ����ϰ�... 
�躸�� ����� �� Ŀ���� ��ŭ...
�׳��� ���� �ܼ��ؼ� �������Ͽ� �������� ���� �� Ŭ������ �۾��ؼ� �������߾���ϴ�.

��� Ŭ�������� Inserface�� ����ϵ��� �Ǿ��־�ٸ�.. 
�翬�� �׷��� �߰�����, �׷��� ���� ������� �ȾҴ�����.. (������... �� �� ���Ҳ���... )

ó���� ������ ���鼭 �������� �Ϸ��� �������̽��� ����ϴ� ���̿��µ�...
���� �������̽��� ���� ������ �󸶳� �߿������� ������ ���־�� ���̿����ϴ�.

��.. �̹� 3���̳� �� ���̶�.... �׶� ��  �Ƿ��� ���ݺ��ٵ� �ξ� �������⵵ �ϱ���.. (���ݵ� ���� ���̴� ������.. ^^)

--
Google �׷콺 'Korea Spring User Group' �׷쿡 ���������Ƿ� �� ������ ��۵Ǿ���ϴ�.
�� �׷쿡 �Խ��Ϸ��� ks...@googlegroups.com(��) �� �̸����� ��������.
�׷쿡�� Ż���Ϸ��� ksug+uns...@googlegroups.com�� �̸����� �����ּ���.
�� ���� �ɼ��� ������ http://groups.google.com/group/ksug?hl=ko�� �� �׷��� �湮�ϼ���.



--
* ���������! http://kwon37xi.egloos.com
--
Google �׷콺 'Korea Spring User Group' �׷쿡 ���������Ƿ� �� ������ ��۵Ǿ���ϴ�.
�� �׷쿡 �Խ��Ϸ��� ks...@googlegroups.com(��) �� �̸����� ��������.
�׷쿡�� Ż���Ϸ��� ksug+uns...@googlegroups.com�� �̸����� �����ּ���.
�� ���� �ɼ��� ������ http://groups.google.com/group/ksug?hl=ko�� �� �׷��� �湮�ϼ���.

--
Google �׷콺 'Korea Spring User Group' �׷쿡 ���������Ƿ� �� ������ ��۵Ǿ���ϴ�.
�� �׷쿡 �Խ��Ϸ��� ks...@googlegroups.com(��)�� �̸����� ��������.
�׷쿡�� Ż���Ϸ��� ksug+uns...@googlegroups.com�� �̸����� �����ּ���.
�� ���� �ɼ��� ������ http://groups.google.com/group/ksug?hl=ko���� �׷��� �湮�ϼ���.

Ju-yeon Yu

unread,
Apr 25, 2013, 10:58:50 PM4/25/13
to ks...@googlegroups.com
본 게시물이 게시된지 오래 되어서 해결을 하셨을 수도 있지만,

저처럼 동일한 문제로 고민하고 계실분들을 위해 제가 이용한 방법을 적어보렵니다.

기본적으로 Spring Security 의 SessionRegistryImpl 은 각 WAS Instance 별로 로그인 성공시의 Session 정보를 간직하고 있습니다.
(해당 내용은 SessionRegistryImpl 코드를 확인한 결과입니다.)

그래서, 각 Instance 에서 공유할 수 있는 공간을 만들면 되겠다는 생각에 구글링을 하다 보니,


와 같은 게시물을 보게 되었고, 분산환경을 지원하는 Ehcache 를 이용하여 SessionRegistry 를 재구현하여 세션 동시 제어를 할 수 있게되었습니다.

물론 이 과정에 삽질도 좀 많았습니다만.

Ehcache 관련해서도 유용해보이는 주소 남깁니다. http://www.slideshare.net/heungrae_kim/spring-31-ehcache


2012년 4월 19일 목요일 오전 11시 9분 8초 UTC+9, namkyu Lee 님의 말:
웹 사이트 중복 로그인 방지에 대하여 여쭙고자 글 올립니다.

정병열

unread,
Sep 3, 2014, 3:46:20 PM9/3/14
to ks...@googlegroups.com
안녕하세요.. 이중화 작업중에 톰캣 클러스터링으로 스프링 시큐리티로 생성된 세션이 공유가 되지 않아, 문의 드립니다.. 정확히 어떻게 작업을 진행 하셨는지 좀 알수 있을까요..?

2013년 4월 26일 금요일 오전 11시 58분 50초 UTC+9, Ju-yeon Yu 님의 말:
Reply all
Reply to author
Forward
0 new messages