안녕하세요 .Spring Sccurity 관련한 질문하나 드립니다.

3,885 views
Skip to first unread message

용이

unread,
Jun 15, 2009, 12:33:38 AM6/15/09
to Korea Spring User Group
안녕하세요. 매번 눈팅만 하다가 질문하나 올려볼려구요.

현재 프로젝트에서 Spring Security 를 이용해 사용자 인증 부분을 처리했습니다.
개발환경에서는 문제가 없었는데 주말에 상용환경으로 포팅을 하면서 문제가 생겼습니다.

WEB 서버가 L4 밑으로 2대가 이중화 구성으로 되어 있는데, 사용자 인증을 못하고 있습니다. 내부 네트웍에서 web
server의 real ip로 접속하면 문제 없이 인증처리가 되는 것을 보면 문제는 L4의 vip로 접속하지만 tomcat은
real ip로 request를 받기 때문에 session 정보가 유지되지 않는 것 처럼 보입니다.

Spring을 처음 사용하는 것이라 정확하게 어떻게 문제를 해결해야 할 지 판단이 잘 안서는 군요. 구글신께 여쭤봐도 딱히 대답
도 않주시고..
오늘 오후부터 인수시험을 해야 하는데 난감하기 그지 없습니다. ㅜㅜ

참고고 Spring 2.5 의 security 의 필터는
context.HttpSessionContextIntergrationFiler를 사용해서 구현하였습니다.

비슷한 문제로 고민해 보신분이 계실것 같은데 조언해 주시면 감사하겠습니다.


yangkun

unread,
Jun 15, 2009, 12:40:01 AM6/15/09
to Korea Spring User Group
요청을 ip 말고 도메인으로 해보면 어떨까요 ?

박성철

unread,
Jun 15, 2009, 12:53:51 AM6/15/09
to Korea Spring User Group
L4 설정을 session이 유지하도록 변경하거나 WAS를 session replication 되도록 설정해보세요.
아마도 L4가 매번 다른 서버로 라우팅하는데 WAS는 session 정보를 공유하지 않기 때문에 접속 할 때 마다 세션이 리셋되
는 것 같습니다.

On 6월15일, 오후1시33분, 용이 <yhle...@gmail.com> wrote:

신승한

unread,
Jun 15, 2009, 1:23:39 AM6/15/09
to ks...@googlegroups.com

  1. L4에서 같은 IP인지 구분해서 같은 IP이면 동일한  WAS로 전송을 해주도록 바꾸던가.

  2. 2대의 WAS에 있는 session정보를 모두 복사하는 클러스터링을 하던가 해야 합니다.

session에 데이터를 자주 넣지 않으며  톰캣 아닌 웹로직 같은거 사용하시면 후자를 택하시면 될듯 하네요.


2009년 6월 15일 (월) 오후 1:53, 박성철 <gyu...@gmail.com>님의 말:

용이

unread,
Jun 15, 2009, 2:17:33 AM6/15/09
to Korea Spring User Group

여러분들의 조언 덕분에 문제가 잘 해결되었습니다.
L4 switch의 설정 변경을 시도해 보고 지원이 잘 안되면 tomcat의 session 클러스터링을 이용하기로 했습니다.
정말 감사합니다. ^^

On 6월15일, 오후2시23분, 신승한 <my.p...@gmail.com> wrote:
> 1. L4에서 같은 IP인지 구분해서 같은 IP이면 동일한 WAS로 전송을 해주도록 바꾸던가.
>
> 2. 2대의 WAS에 있는 session정보를 모두 복사하는 클러스터링을 하던가 해야 합니다.

> > > 비슷한 문제로 고민해 보신분이 계실것 같은데 조언해 주시면 감사하겠습니다.- 원본 텍스트 숨기기 -
>
> - 원본 텍스트 보기 -

Joshua

unread,
Jun 15, 2009, 2:46:18 AM6/15/09
to Korea Spring User Group
아아-
멋집니다.
저도 뭔가 어려운일을 KSUG에 물어보고 싶어집니다.
왠지 멋지게 해결될 것 같아요-

윤희한

unread,
Jun 15, 2009, 8:51:19 PM6/15/09
to ks...@googlegroups.com
역시 스프링 시큐리티에서는 세션공유가 되지 않는군요..

그것때문에 저히는 결국 쿠키를 이용하기로 했지요 ㅜ.ㅜ

그러다보니.. 기존 구현체를 거의 못쓰고 소스를 약간씩 뜯어고쳐서 개발했다는 ㅜ.ㅜ


안영회

unread,
Jun 15, 2009, 8:54:04 PM6/15/09
to ks...@googlegroups.com

역시 스프링 시큐리티에서는 세션공유가 되지 않는군요..


'Session 공유가 안된다'는 무슨 뜻이죠?

안영회

unread,
Jun 15, 2009, 8:55:13 PM6/15/09
to ks...@googlegroups.com
역시 스프링 시큐리티에서는 세션공유가 되지 않는군요..


'Session 공유가 안된다'는 무슨 뜻이죠?
세션 복제를 안해준다는 의미인가요?

윤희한

unread,
Jun 15, 2009, 8:59:43 PM6/15/09
to ks...@googlegroups.com
아~~ 위에분처럼 .. L4로 여러대의 was 를 연결할경우 

인증이 안되더라구요...

그래서 여러포럼을 뒤져봐도 세션공유를 하는법을 

찾을수 없어 쿠키를 사용하는것으로 변경했는데...

혹시 L4로 분배할경우에도 세션을 이용해서

인증하는법이있을까요??

개인적으로 쿠키를 싫어해서 ㅜ.ㅜ



2009년 6월 16일 (화) 오전 9:55, 안영회 <ahnyo...@gmail.com>님의 말:

신승한

unread,
Jun 15, 2009, 9:09:13 PM6/15/09
to ks...@googlegroups.com
쿠키로 어떻게 인증을 하지요?

httpSession에 데이터를 저장하는 대신 쿠키에 저장한다는 뜻인가요?


보통 L4에서 해시기능을 제공하거나

WAS에서 세션복제 기능을 지원한다면 그것을 쓰시면 될텐데요.

스프링 시큐리티를 안써봐서 어떤식으로 인증을 하는지 잘 모르겠네요.


2009년 6월 16일 (화) 오전 9:59, 윤희한 <ryys...@gmail.com>님의 말:

윤희한

unread,
Jun 15, 2009, 9:11:44 PM6/15/09
to ks...@googlegroups.com
그냥 일반적인 쿠키인증입니다.

AnonymousProcessingFilter 였나.. 익명객체 만드는놈 소스를 보고 약간씩 고쳐서 사용했습니다.

테스트는 잘 통과한거같은데 아직 실서비스에 투입해보질 못해서..

혹시나 제가 빼먹은 구멍이 있을지도 모르겠네요 ㅜ.ㅜ

안영회

unread,
Jun 15, 2009, 9:12:00 PM6/15/09
to ks...@googlegroups.com

아~~ 위에분처럼 .. L4로 여러대의 was 를 연결할경우 

인증이 안되더라구요...

그래서 여러포럼을 뒤져봐도 세션공유를 하는법을 

찾을수 없어 쿠키를 사용하는것으로 변경했는데...

혹시 L4로 분배할경우에도 세션을 이용해서

인증하는법이있을까요??


Layered 아키텍처 패턴을 이해하지 못하셨군요.
TCP 나 OSI 7계층이 주는 이점을 아신다면 애플리케이션 계층에 속하는 SpringSecurity에서 네트워크 수준 제어를 하기 원하시나요?
위에 답변처럼 세션복제나 L4가 제공하는 기능을 쓰는 방법이 자연스러운 듯 합니다.
그리고 '세션 공유'는 적절한 표현이 아닌 듯 하네요.

윤희한

unread,
Jun 15, 2009, 9:15:35 PM6/15/09
to ks...@googlegroups.com
저도 진즉 여쭤볼껄 그랬습니다..

Layered 아키텍처 패턴 <== 요놈에 대해 알아보겠습니다 ^^

친절한 설명 감사합니다.

P.S 세션복제에 대해서도 한번 알아볼께요~~ ^^ 오늘 많은거 배워갑니다.

감사합니다.~

2009년 6월 16일 (화) 오전 10:12, 안영회 <ahnyo...@gmail.com>님의 말:

superman

unread,
Jun 16, 2009, 9:38:42 AM6/16/09
to Korea Spring User Group
저는 사이트에서 경험한것 몇가지 말씀드리죠..

일단 위에서 말씀 하셨던 것과같이. 분산환경을 사용하는 경우
L4의 설정에 따라 사용자들이 어디로 접속될지 알수 없기 때문에 WAS들간의
Session 공유가 필요하게 됩니다.

Tomcat과 Jeus 등 대부분의 WAS Engine들이 이런 Cluster 기술들을 지원하는 것으로 알고 있습니다.
제가 알고 있기로는 이런 기술들을 지원하기 위해.
( WAS 들간의 Key 구분 ) jsessionid의 뒷부분에 ".jvmName" 이 추가된 것으로 알고 있습니다.
해다 WAS의 ID를 추가해서 어떤 WAS에 해당 정보가 저장되어있는지 알수있는 것이지요.

물론 이런 환경이 기본이지만....
사이트에서 적용한적이 있는 몇가지 를 말씀드리면.

1. 동일한 사용자가 다른 Cluster로의 이동을 최소화 한다.
1.1
L4 Switch 같은 경우 여러 조건으로 balance 를 하게 되어 있습니다.
기본적으로 L4는 해당 Server와의 connection개수를 기반으로 분산을 하게 되지만,
이런 방법 말고도 Client IP를 기반으로 Balance 할수 있습니다.
예를 들어 Cluster 서버가 5대 인경우 마지막 자라 IP를 기준으로
XXX.XXX.XXX.1/XXX.XXX.XXX.6/XXX.XXX.XXX.11 ==> 1번서버
XXX.XXX.XXX.2/XXX.XXX.XXX.7/XXX.XXX.XXX.12 ==> 2번서버
XXX.XXX.XXX.3/XXX.XXX.XXX.8/XXX.XXX.XXX.13 ==> 3번서버
XXX.XXX.XXX.4/XXX.XXX.XXX.9/XXX.XXX.XXX.14 ==> 4번서버
이런 식으로의 처리도 가능하다는 거죠.
그렇다면 사용자들이 IP대역에 골고루 분포한다면 사용자들은 Cluster를 돌아다니지 않고
일정한 서버로 계속 접속하게 되죠.
물론 해당 서버에 문제가 있을 경우 L4는 다른 Server로 접속을 전달하게 됩니다.
이때는 세션복제가 일어나겠죠..

1.2
또다른 방법으로는 Balance 작업을 한번만 하게 하는 거죠
사용자들이 처음 접속하는 혹은 로그인 하는 Page는 L4 IP로 접속하여
처리하게 하고 그런다음 실제 업무하는 Page로 변경될때 접속IP를 지금 접속한 HOST로 하는 거죠
이렇게 하려면 Cluster마다 소스 파일이 조금 달라져야 하죠.. ( 아주 조금 ㅋㅋ )
이렇게 하면, 처음에 Login 될때만 Balance되고 그다음 부터는 계속 해당 서버에 접속하게 되기
때문에 Session 복제는 필요하지 않습니다.
이 방법은 은행 사이트에서도 사용되어 지는 것으로 생각됩니다.
은행 사이트에 접속해보면 일반 Main Page와 계좌 이체를 하는 Page의 domain이 다르고
계좌이체같은 중요한 부분은 doamin뒤에 숫자같은 것들이 붙어 있는가 가끔 접속해 보면
그 숫자가 바뀌는 것으로 봐서는 아마도... 이런 방법을 사용하지 않을까 합니다.


이렇게 해서 세션복제를 최소화 하였습니다.
이렇게 까지 세션복제를 최소화 할려구 했던건 여러가지들의 다른 문제가 좀있었거든요
1. SESSION에 너무 많은 Data를 담고 있어서
session에는 최소한의 정보만 담아야 하는데.. 좀 필요한 정보를 많이 담다 보니 session양이 좀 무거워져
session 복제에 부담이되기도 했고
2. 특정 was 같은경우 session 복제하면 was 성능이 현저하게 떨어졌다는 사이트 엔지니어의 이야기를
들어본적도 있어서( 물론 was 자체의 문제가 아니라 다른 주변환경 의 문제였을수도 있지만, ) session 복제를
최소화 하는 방법을 고민해 보았습니다.


위의 두 제시안 모두 주의 사항이 있습니다.
1.1 의 경우는 적용을 시도하다가 포기한적이 있는데....
적용한 곳이 200군대 정도의 지사 를 가지고 있는 곳이었습니다.
이런 지사들은 각각 방화벽을 사용하고 내부 상용자들은 사설 IP를 사용하고 방화벽의 NAT 기능을 통해
외부와 연결되고 있었습니다.
문제는 대부분의 방화벽 담당자들이 방화벽의 IP를 XXX.XXX.XXX.254 아님. XXX.XXX.XXX.1 뭐 이
런식으로
특정 번호를 사용하고 있었던 것입니다. 이렇게 되면.
1.1 의 방법을 상요하게 되면, Load Balance가 되지 않고 한쪽으로 치우치게 됩니다.
그러서 1.1 은 포기한 적이 있죠.


1.2 의 경우는 Cluster 고유의 기능 때문에 약간 고민해야 합니다.
전체 부하를 여러 Cluster들이 분산하여 처리한다는 개념도 있지만, Cluster들 중 하나에 문제가 생겨도
다른 Cluster들이 해당 Request를 받아 처리해 줄수 있어야 하는데. 이에 문제가 되는거죠
사용자는 모르지만 이미 로그인 Page에서 사용자는 어떤 Cluster를 사용할지 결정을 했고
사용자는 계속해서 해당 Cluster를 사용하고 있기 때문에 해당 Cluster에 문제가 생기면, 서비스를 받지 못하게
됩니다.
물론 해결 방법은 간단 합니다. 다시 로그인 하면되죠.. ^^;;
하지만, 이렇게 서비스가 되지 않는 경우는 잘 없었기에 저희는 이 방법을 사용하고 있습니다.


위의 두방법으로 처리하였을 경우 특히 1.2를 사용하였을 경우는 세션복제가 필요하지 않습니다.
1.1의 경우도 거의 세션복제가 일어나지 않는다고 보여지지만,
가능성은 있기 때문에 세션복구기능을 구현해 두면 용의합니다.

세션복구기능은 세션복제기능과 유사합니다.
세션복제는 생성된 세션정보를 COPY하는 것이라면 세션복구는 세션KEY를 이용하여
세션을 다시 생성하는 것이라고 생각하면 됩니다.
위에서 언급한 것과 같이 세션에는 해당접속자 혹은 사용자의 고유정보가 저장되는 것이
일반적입니다. 그렇다면 사용자 ID 만으로 세션정보를 제생성하는 것이 가능합니다.
물런 그렇다고 사용자 ID를 세션복구의 KEY로 그대로 사용한다면 문제가 될것이고
SESSIONKEY --- USERID 뭐 이런 상관관계를 가지는 영속 Layer를 가지고 있다면
문제는 간단히 해결됩니다.

제가 관리하는 application의 경우 아침에 로그인해서 저녁에 로그아웃하기 전까지
session이 유지되어야 하고 사용자 수도 많아서 session 유효기간을 적당히 조절하고
세션 복구기능을 사용하여 휴지상태에 있던 사용자가 다시 서비스를 받고자 하면 세션을 복구
하는 방법을 사용하고 있었기에 위의
대안들을 생각하고 적용해 볼수 있었습니다.


그렇다고 WAS의 세션복제기능이 완전히 필요하지 않다는 것이 아니라
성능 향상을 위해 위의 사항들도 고려해 봐야 하지 않을까 하는 생각이고
제가 격었던 혹은 적용했던 내용을 정리해 보았습니다.

다른 분들은.. 어떠신가요.?

On 6월16일, 오전10시12분, 안영회 <ahnyoung...@gmail.com> wrote:
> > 아~~ 위에분처럼 .. L4로 여러대의 was 를 연결할경우
> > 인증이 안되더라구요...
>
> > 그래서 여러포럼을 뒤져봐도 세션공유를 하는법을
>
> > 찾을수 없어 쿠키를 사용하는것으로 변경했는데...
>
> > 혹시 L4로 분배할경우에도 세션을 이용해서
>
> > 인증하는법이있을까요??
>
> Layered 아키텍처 패턴을 이해하지 못하셨군요.
> TCP 나 OSI 7계층이 주는 이점을 아신다면 애플리케이션 계층에 속하는 SpringSecurity에서 네트워크 수준 제어를 하기
> 원하시나요?

> 위에 답변처럼 *세션복제*나 L4가 제공하는 기능을 쓰는 방법이 자연스러운 듯 합니다.

신승한

unread,
Jun 16, 2009, 10:37:04 AM6/16/09
to ks...@googlegroups.com

저도 세션에 이것저것 넣어두기를 좋아해서 세션복제를 쓰기가 꺼려지더군요.
(물론 직접 측정은 한번도 안해봤습니다.)

그래서 apache가 해주는 분배 기능을 사용합니다.
(L4가 있긴한데..  설정할줄을 몰라서 그냥 장식용으로 사용합니다.)

hash기반이라.. 세션을 간혹 체크해보면 사용자가 WAS별로 들쭉날쭉 이네요.


그리고 위에 말씀하신 1.2방식은 어떤식으로 구현하는 건가요?
힌트좀 주세요~ ^^



2009년 6월 16일 (화) 오후 10:38, superman <sup...@gmail.com>님의 말:

superman

unread,
Jun 16, 2009, 7:47:41 PM6/16/09
to Korea Spring User Group
간단하게 그림을 그렸습니다.
근데 파일을 그룹스에 올리는 방법을 몰라서 ^^;

그룹스 홈에 파일이란 곳에
세션복제 최소화01.jpg
세션복제 최소화02.jpg
파일이 있으니 참고하시구요.
도움이 될려는지 모르겠지만,
각각 1번가 2번의 적용방법입니다.

참 위의 방법들이 세션복제를 하지 않아도 되는 방법은 아닙니다.
신중히 고려해서 적용하시기 바랍니다.

그리구 글에 파일 올릴수 있는 방법 좀 알려주세요.ㅋㅋ

안영회

unread,
Jun 16, 2009, 7:55:05 PM6/16/09
to ks...@googlegroups.com
파일 업로드 테스트
img09.gif

안영회

unread,
Jun 16, 2009, 7:58:50 PM6/16/09
to ks...@googlegroups.com
그룹스에서 쓰면 본문에 어찌 그림을 넣을지 메뉴가 보이지 않네요. 도움말에도 파일 올리는 방법만 있고, 메시지에 넣는 방법은 설명하지 않고 있구요.

메일에서 이미지를 첨부하면 위 테스트 메시지처럼 보입니다.
Message has been deleted

전형민

unread,
Jun 16, 2009, 8:21:07 PM6/16/09
to ks...@googlegroups.com
말씀하신 방법대로..
파일을 첨부 합니다.
 
^^;
제가 잘못올려서 토론 제목이 변경되어서요..
올린글 삭제하고 다시 올렸습니다.
메일로 지저분한 것들이 전달되어 죄송 ^^;;

2009년 6월 17일 (수) 오전 8:58, 안영회 <ahnyo...@gmail.com>님의 말:
그룹스에서 쓰면 본문에 어찌 그림을 넣을지 메뉴가 보이지 않네요. 도움말에도 파일 올리는 방법만 있고, 메시지에 넣는 방법은 설명하지 않고 있구요.

메일에서 이미지를 첨부하면 위 테스트 메시지처럼 보입니다.



--
------------------------------------
당신의 과거가 당신을 만든다.
방안01.jpg
방안02.jpg

신승한

unread,
Jun 16, 2009, 8:32:41 PM6/16/09
to ks...@googlegroups.com

두번째 부터는 L4주소가 아닌 WAS로 직접 연결되는 별도의 도메인으로 연결되는군요.

이런 방법이 있었네요~ ^^  참고해야겠습니다.

 그림 올려주셔서 감사합니다.


2009년 6월 17일 (수) 오전 9:21, 전형민 <sup...@gmail.com>님의 말:

박성철

unread,
Jun 16, 2009, 8:36:42 PM6/16/09
to Korea Spring User Group
저도 1.1 방식으로 했다가 된통 당한 적이 있습니다. 정부 부처는 행자부의 공용망을 사용하는데 NAT로 전 공무원이 몇개 IP
를 공유하는지라 잘못하면 한쪽으로 엄청 몰리더군요. ^^

그래서 저는 이것을 pound( http://www.apsis.ch/pound/ )라는 reverse proxy를 사용해서 해결
했습니다. 모든 reverse proxy에 이 기능이 있는지 모르겠지만 pound는 cookie의 session key로
session을 유지하는 기능이 있습니다. L4는 IP로만 할 수 있지만 reverse proxy는 소위 말하는 L7
switch에 해당하므로 http 프로토콜을 해석해서 더 정밀한 routing 정책을 수립할 수 있습니다.

요즘은 pound 말고 nginx가 대세인 것 같은데 nginx에서도 이런 기능이 있는 지 모르겠네요.

용이

unread,
Jun 16, 2009, 9:15:26 PM6/16/09
to Korea Spring User Group
질문하나 올렸을 뿐인데 많은 유용한 정보를 얻어가네요.
감사합니다 ^^

On 6월16일, 오후10시38분, superman <sup...@gmail.com> wrote:

> > 그리고 '세션 공유'는 적절한 표현이 아닌 듯 하네요.- 원본 텍스트 숨기기 -

Reply all
Reply to author
Forward
0 new messages