여러 머신을 사용할때 jsp 세션 관리..
글쓴이: cleol / 작성시간: 월, 2003/12/29 - 2:06오후
서버 5대를 가지고 서비스를 해야합니다. 5대 모두 웹서버가 돌아갑니다. 이중 4대는 같은 내용을 서비스 할겁니다. 앞에 L4 가 붙어있습니다. 나머지 1대는 다른 4대와 다른 내용을 서비스합니다. 이 1대는 다른 4대와 url 도 다릅니다(서브 도메인만 다릅니다). 문제는 jsp 세션관리를 어떻게 해야할지입니다. 중복 사용이 안되게 해야합니다. 어떤 아이디로 로그인 되어있을때 같은 아이디로 다른 누군가가 로그인한다면 이전에 사용하던 사용자는 로그 아웃되어야 합니다. 서로 다른 머신 사이에 jsp 세션을 공유할 수 있는지 궁금합니다. 만약에 안된다거나 제약 조건이 많다면 jsp 세션을 사용하지 않고, 대신에 직접 쿠키를 사용하는 세션 관리를 구현해서 한 대를 인증서버로 만들어서 매 요청마다 인증 서버에 세션 정보를 요청하는 방식도 생각해봤는데 실행 성능에 영향이 있을거 같고 세션 정보를 관리하는 로직을 쉽게 구현할 수 있을지도 확실치 않군요. 어떤 방법이 있을까요. 환경은 jsp를 사용할 수 있기만하면 됩니다. os, 서블릿 컨테이너, 웹서버 모두 관계 없습니다.
Forums:
곤란합니다 .
세션은 공유될수 없습니다 . (jsp 한지 넘 오래되서 최근에는 어떤지 모르겠으나 제가 했을당시에는 서버간에 세션은 공유할수 없었습니다 .)
이 문제는 여러대임을 떠나서 단 1대로 서비스하더라도 구현하기가 곤란합니다 .
이는 비단 jsp 의 문제라기보다 http 의 stateless 한 특성으로 볼수 있겠지요 . 쿠키를 사용한다 할지라도 과연 로그아웃은 어떤식으로 처리해야 할런지 의문이군요 (정상적인 로그아웃이 아닌 강제종료라면 ?)
클라이언트가 별도로 신호를 보내주지 않는다면 서버로서는 클라이언트가 로그인상태인지 아닌지의 여부를 전혀 판별할수가 없습니다 . (http 는 push 가 불가능한 프로토콜이니까요)
결국 서버가 아닌 클라이언트에서 해결해야 하고 예전에는 applet 을 이용하여 인증서버와 통신하는 방법을 주로 사용하였었으나 최근에는 active-x 를 이용하는 방식을 많이 사용합니다 . (최소한 IE 에서는 이 방법이 훨씬 깔끔하지요) 별도의 인증서버를 두고 IE 의 active-x 에서 주기적으로 신호를 주고받아 로그인상태임을 확인하는 방식이지요
물론 별도의 vc++ (혹은 이에 상응하는 active-x 를 만들수 있는 툴) 기술이 필요하고 인증서버(IRCd 등의)또한 구축해야 하므로 쉬운일은 아닙니다 .
결론적으로 로그인유지를 구현하는건 힘든일입니다 .
--
Sang-Kil Park
공유 가능합니다. 하지만 안하는게 좋습니다 :)일반적으로 로드밸런
공유 가능합니다. 하지만 안하는게 좋습니다 :)
일반적으로 로드밸런싱에는 session affinity 혹은 session replication을 씁니다. 전자의 경우가 가장 편하고 성능도 좋습니다. 특별한 이유가 없다면 전자의 방법을 이용해 스위치나 mod_jk 커넥터 등을 이용해 앞단에서 사용자를 적절하게 서버들에 분산하고 한번 특정 서버에 들어간 사용자는 세션 동안 해당 서버에만 리퀘스트를 받게 설정하는게 좋습니다.
후자의 경우 어플리케이션 서버 수준에서 대부분 지원합니다.
말씀하신 기능은 굳이 세션 공유를 사용하지 않아도 충분히 구현 가능할 것 같습니다. 어차피 세션 공유를 한다고 해도 그런 기능은 직접 프로그램 수준에서 구현 해야할 것 같군요.
참고하세요...
----------------------------
[서명] 그놈 한국 사용자 모임 - 그놈에 대한 모든 것! - 게시판, IRC, 위키, 갤러리 등등...
질문한가지 ..
옷~ 세션이 공유가 되는군요 :oops:
구글선생님한테 Session Replication 을 물어보니 자료가 좌르륵 쏟아지는군요 .. 덕분에 저에게도 도움이 되었네요 :)
--
Sang-Kil Park
좀더 쉽게 ..
앞서 쓰레드에 너무 어렵게만 생각했는데 좀더 쉽게 생각해보면 (critical 하지는 않다는 가정하에) 쿠키+DB 만으로 로그인을 구현할수 있을것같습니다 .
브라우저가 최초접근시 랜덤하게 생성해둔 인증키를 부여하고 이를 DB 에 저장하여 로그인상태임을 알립니다 .
request 마다 DB 와 대조하여 인증키가 맞는지 확인하여 인증키가 맞다면 로그인상태로 간주합니다 .
다른 브라우저에서 로그인이 실행될경우 인증키의 보유유무를 판별, 인증키가 다르거나 존재하지 않는다면 새로운 인증키를 발급하고 이값을 DB 에 저장합니다 .
자연히 기존의 브라우저에서 request 요청시 인증키가 틀리므로 로그아웃상태로 처리합니다 .
장점 : 세션 안씀, 별도의 로그아웃과정 필요치않음
단점 : 매 action 수행시마다 DB 와 대조하는 cost 가 소요됨, 로그아웃을 판별할 수 가 없음 (이부분은 또 다른 트릭을 사용한다면 해결할수는 있으리라 봅니다)
@ 실제로 MS 의 Duwamish Online 이라는 프로젝트에서 state 를 관리하기 위해 사용되었던 방법입니다 . (asp 에서는 session replication 이 되지않으므로) DB 의 부하가 심해진다는 단점이 있긴하지만 가장 쉽게 구현할수 있는 방법이라 생각되네요 .
--
Sang-Kil Park
그런데.. 1대 4대 가 틀린서비스이고 세션을 공유할려면.. jsp로는
그런데.. 1대 4대 가 틀린서비스이고 세션을 공유할려면.. jsp로는
db방법이나 쿠키 아니면 인증서버를 두는방법밖에 없지 않나요? ^^;;
4대만 세션을 공유한다면야.. 로드밸런싱이나.. 아니면.. 쿠기
httpd 3대에 was1대 아니면 db, 인증서버 이런식으로 여러방법이 있겟지만..
서비스 종류가 틀린..1대 4대가 세션을 공유할려면..db나 쿠키방법밖에 없을거
같은데요..
[quote="jw0717"]그런데.. 1대 4대 가 틀린서비스이고 세션
session affinity는 동일한 서비스를 전제로 하지만 session replication은 전혀 관계 없습니다. 다만 세션에 담는 데이터가 Seriailizable을 구현하기만 하면 됩니다. 일반적으로 replication 시에는 리퀘스트가 있을 때, 혹은 일정 한 주기로 노드간의 세션 값을 동기화 합니다. 이는 순수하게 어플리케이션 서버 단에서 일어나는 일이기 때문에 실행되는 서비스가 달라도 문제되지 않습니다.
단 위에서 말씀하신 중복 로그인 시 최초 세션을 로그아웃 시키는 문제는 설사 세션 replication을 쓴다고 해도 자동으로 해결되는게 아니기 때문에 어떤 방식으로든 프로그램으로 구현을 해야할 것 같군요...
----------------------------
[서명] 그놈 한국 사용자 모임 - 그놈에 대한 모든 것! - 게시판, IRC, 위키, 갤러리 등등...
...
일단 클라이언트에 activeX 컴포넌트 또는 애플릿을 심기로 했습니다. 하지만 서버측에 세션 정보를 저장하는 방법을 아직 결정하지 못했습니다. 데이터 베이스에 저장하는 것은 부하가 심할 듯 해서 일단 제외하려고 합니다.
웹에서 이리 저리 정보를 찾아보다보니 asp session management server 라는 프로젝트가 있었더군요. 분위기로 봐서 현재는 개발 중단 상태인 것 같습니다. 일단 아이디어는 세션 정보를 ldap 서버에 저장한다는 겁니다. RDBMS 에 저장하는 것보다 가볍다고 하는군요. 이 프로젝트는 asp 용이어서 adsi 를 이용해서 구현했지만 jsp 에서는 jndi 를 이용해서 구현하면 될 듯합니다. ldap 서버는 OpenLDAP 나 MS 액티브 디렉토리를 사용해야 할 것 같구요. 서버 환경이 윈도우가 될 듯하니 아마 액티브 디렉토리를 사용할 듯 합니다. 하지만 ldap 같은 디렉토리 서비스에 대한 지식이 부족해서 이게 현실성 있는 방안인지 확실치가 않군요. 디렉토리 서비스에 대해 잘 알고 계신분들의 조언을 구합니다.
그리고 싱글 사인온 솔루션들에서 대체로 LDAP 서버에 인증 정보를 저장한다고 하는데 이게 사용자 정보(아이디, 패스워드, 이름 등등)를 LDAP 서버에 저장해 놓는다는 말인가요? 아니면 세션 정보를 LDAP 서버에 저장한다는 뜻인가요? 만약에 세션 정보를 저장해 놓는다는 말이라면 위에 설명한 방법과 기본적으로는 같은 원리를 사용하는 건지....만약에 그렇다면 현실성이 있는 방안이라고 생각해도 되겠군요..^^;
댓글 달기