비얌

중복 로그인에 대한 고찰 본문

Study

중복 로그인에 대한 고찰

비얌 2008. 2. 11. 12:06
예전에는 중복 로그인이 가장 큰 이슈였다.
지금 생각해보면 중복 로그인에 대한 관점을 그렇게나 고민해야 했나는 생각이 든다.어차피 Web은 환경이 중복 로그인을 허락하는 환경이 아닌가? 굳이 중복 로그인을 금지해야할 필요성을 좀 못느끼게 되는 것은 사실이다. 물론 전자 상거래 시스템에서 같은 사이트를 여러 창으로 열어 물건을 주문하게 되면 주문이 동시에 진행되기 때문에 데이터가 꼬일 수는 있으나, 과연 이것을 중복 로그인을 막음으로써 해결하는게 정답일까라는 생각이 든다. 지금 생각으로는 Session에 데이터를 쌓아두고 아니면 conversation level에서 처리를 해야하지 않을까?

좀 더 생각을 해봐야겠다.

아래글은 예전에 싱글톤 방식의 디자인 패턴에 대한 욕심이 나서 중복로그인과 연결해 본 글이다. 단지 기록이 아까워서 모아둔다.

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

항상 사이트를 개발할 때 마다 고민을 하는 부분이 User의 로그인에 대하여 중복을 체크하느냐 마느냐 입니다. 중복 로그인이 가능할 필요가 있는 경우도 있고, 절대 불가능할 경우도 있었습니다. 그 불가능한 경우 때문에 여러번 고민을 하고 해결 방법을 생각해 봤지만 시간에 ?i겨 제대로 작성을 하기는 힘들었죠.
 
그런데 이번에 개발하는 사이트에서 중복로그인을 허용하면 안될 것 같고, 아직 사이트 설계 단계이기에 시간도 충분해서 그옛?생각해 봤던 것을 적용해 봤습니다.
 
일단 WAS 서버는 Tomcat 5.x입니다.
 
또한 중복 로그인 정책은
"사용자가 맨 처음 로그인을 하였을 경우, 뒤에 사용자가 로그인을 하게 되면 두 로그인을 전부 끊어버린다."
"사용자가 두개 이상의 창으로 동시에 로그인을 할 수 없게 한다."
입니다.
 
사용한 방법은 그냥 간단하게 싱글톤(제가 아는 범위에서 입니다...ㅡㅡ;) 방식을 적용시켜 사용자의 Session ID를 저장하게 하는 것입니다.
 
일단 간단한 소스를 보게 되면....
============ TheOne.java ========================
import java.util.Vector; // 그냥 Vector 썼습니다.
 
public class TheOne(){
     private static final TheOne INSTANCE = new TheOne();
 
     private Vector SET = new Vector();
 
     private TheOne(){
        SET.add("session set start~~!!");
     }
 
     public static final TheOne getInstance(){
        return INSTANCE;
     }
 
     public Vector getVector(){
        return SET;
     }
 
     public void setVector(Vector SET){
         this.SET = SET;
     }
}
===============TheOne.java=====================
 
===============test.jsp=========================
<%@ page language="java" pageEncoding="euc-kr" %>
<%@page import="com.e_inspot.chip.*,java.util.*"%>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
<%
 session.setAttribute("name","name");
 
 TheOne to = TheOne.getInstance();
 
 Vector vec = to.getVector();
 
 Enumeration vec_en = vec.elements();
 int i = 0;
 boolean flag = true;
 while(vec_en.hasMoreElements()){
  String temp = (String)vec_en.nextElement();
  System.out.println(i++ + "t" + temp);
  if(temp.equals(request.getSession().toString())){
   flag = false;
  }
 
 
 }
 
 if(flag){
  vec.add(request.getSession().toString());
 }
 System.out.println("session set size : " + vec.size());
 to.setVector(vec);
%>
session set
</body>
</html>
=============================================
 
이렇게 작성을 하고 나서, 계속적으로 login.jsp 페이지를 열어보니 하나의 값만이 들어있게 되고, 다른 브라우저에서 접속하였을 경우만 Vector의 size 증가가 가능하게 되더군요. 물론 페이지에 고정적으로 부여된 값은 다른 페이지로 넘어갔다가 오더라도 가능했습니다.
 
여기서 Vector를 HashMap으로 바꾸고, String으로 변환된 Session을 Value값으로 user id를 Key 값으로 Map을 구성하고 클라이언트가 서버로 접속을 할 때마다 해당  user id값으로 Map에서 찾은 다음, Session 값을 서로 비교하여 같을 경우에는 Exception을 처리하면 되겠다는 것이 지금 제 생각입니다. 물론 기존의 로그인한 경우는 해당 User id를 검사하여 중복 로그인이 되면 안되는 페이지의 접근을 막을려고 합니다.
 
여기까지 생각해 봤는데... 아직도 생각할께 많군요..막상 작성을 하게 되니 영 불만이 쌓이는군요...

======================== 이 상 끝 =================================================
Comments