최근 금융 IT에서는 "중복 로그인 방지" 라는 이야기가 나오고 있습니다.


금융결재원 권고 사항.으로 나왔거든요.


모...대부분의 은행은 각자의 알고리즘과 각자의 솔루션으로 적용 했겠지만.


저는 간단하게 중복로그인 방지를 어찌 해결 할수 있을까를 고민 해보고.


몇가지 "꼼수" (정석이 아니라는 말이죠.ㅎㅎ....모..IT개발엔 정석이 없겠지만요.ㅎㅎ)를


생각해 보았습니다.





고객의 요건들...(몇몇 은행 기준)


중복로그인방지를 위하여, 새로운 사용자가...현재 로그인 되어 있는 채널과 다른 채널을 통한


로그인 시도시...기존 로그인 되어 있는 채널의 사용자를 로그아웃 시켜주어야 한다.


(중복로그인되어 로그아웃 시킨다는 메시지가 있다면 좋겠죠.^^)


[ 채널 : IT거래 경로..보통 PC/Smart Phone/Tablet 등등을 각각 다른 채널이라고 부르더라구요..]







위 요건을 해결 하기 위해...어찌해야 할까요..


모든 채널이 하나의 DB에 접근이 가능하다면 ...이런 방법이 가능합니다.


(여기서 DB가 등장하면 어떨까?  D!B! .... 죄송.)





로그인 할때...현재 로그인한...PC의 ip와 Session(세션id), 사용자 id 정보 기타등등을 DB에 넣습니다.


(모든 채널이 하나의 DB를 보고 있다는 가정입니다.)




그리고 Servlet Filter를 하나 말들고...꼭 servlet filter가 아니라 공통 include에서 해결해도 되긴합니다...


거래 할때마다...DB를 조회합니다.


난 이미 로그인하고 거래중인데 ip나 정보가 나의 정보와 다르다면!!!


로그아웃 해버립니다.



...................................



너무 간단히 해결 되었네요.-_-;





하지만 문제가 있습니다.


우리의 고객분들께서는......거래가 일어날때마다 DB를 조회하는것을 원하지 않으십니다.-_-;


인덱싱까지 걸려 있는 DB Table에 매번 거래 로그남기는건 좋아하지만...이런 상황은 좋아하지 않으십니다.


어찌합니까~? 어떻게 할까요~~?




음...동일한 DB를 쓴다는 가정하에 고민하면...아직까지는 쉽게 해결 할수 있습니다.


로그인이 이루어질때마다. Session객체를 static형태 Hash Map에 담아두는 것입니다...


모 Thread에 안전한 ConcurrentHashMap 정도면 더 좋겠네요..



public static ConcurrentHashMap map = new ConcurrentHashMap();


이런놈을 두고.



map.put(sessionID, Session) 객체를 한군데 모아 둡시다.. (WAS별로 관리해야겠죠..)


======================================================


그리고 "SessionKiller.jsp" 정도의 Servlet이나 jsp파일 한개 둡시다!!


인자로 SessionId정도 받아서.


SessionID에 해당하는 Session을 꺼내서 invalidate 시켜주면 됩니다....



======================================================



여기서 치명적인 문제.-_-


map에다가 담기만 하고....자동 종료되는 session등등...은 꺼내지지 않고.


결국 메모리를 계속 잡아 먹는 괴물이 될것 입니다..



하아.-_-;




하지만  우리에겐.


SessionListener가 있습니다..


아래와 같은 소스를 만들면 됩니다.-_-


제가 짰냐구요?


귀찮아서..stackoverflow에서 훔쳐 왔습니다.


출처는 http://www.coderanch.com/t/365859/Servlets/java/session-object-session-ID


위와 같습니다.




    public class SessionListener implements HttpSessionListener{

   

       public void init(ServletConfig config){

       }

   

     /**

      * Adds sessions to the context scoped HashMap when they begin.

      */

     public void sessionCreated(HttpSessionEvent event){

         HttpSession    session     = event.getSession();

         ServletContext context     = session.getServletContext();

         Map            activeUsers = (Map)context.getAttribute("activeUsers");


         activeUsers.put(session.getId(), session);

     }


     /**

      * Removes sessions from the context scoped HashMap when they expire

      * or are invalidated.

      */

     public void sessionDestroyed(HttpSessionEvent event){

         HttpSession    session     = event.getSession();

         ServletContext context     = session.getServletContext();

         Map            activeUsers = (Map)context.getAttribute("activeUsers");


         activeUsers.remove(session.getId());

     }

 }





자..그럼...로그인 할때마다..기존 로그인 정보를 db에서 읽어와서


해당 하는 서버에 servlet으로 쏴주면 되겠네요?


해결 되었네요!!


하지만.....



우리에게....더 큰 위협이 다가 옵니다..


각각 System마다 다른 DB를 사용한다!!!


하아...-_-;


이쯤 글을 쓰다보면 도망가고 싶어집니다.-_-;;


힘듭니다...머리는 안돌아가고....


그런 분위기입니다..





일단 포스팅 여기까지만 하고..


To be Continue....라고 쓰고.


다음에 이어서 포스팅 하겠습니다.ㅎㅎㅎ






















+ Recent posts