카테고리 없음

자바 자동로그인 구현

znoflo 2008. 4. 19. 13:49

자바 자동로그인 구현

 

개요

자동로그인은 보안문제가 가장 큰 이슈거리죠. 그래서 포탈등에서는 아예 사용을 하지 않고 있습니다. 하지만 제 홈페이지는 규모상 큰 문제가 없을것 같고, 편리함이 더욱 큰지라 넣어 보게 되었습니다. 먼저 인터넷에서 자동로그인 방법에 대해 여기저기 찾아봐도 명확한 답을 찾을 수가 없었습니다. 순전히 개인적인 생각으로 구현해 보았으니 문제가 될 부분이 있다면 가차없는 코멘트 부탁드립니다.

 

시나리오

자동로그인 체크박스에 체크를 하고 로그인을 하면 일정한 길이의 랜덤한 문자열을 생성하여 사용자정보(DB테이블)에 저장해 둡니다. 또한 랜덤한 문자열을 키값으로 MD5 알고리즘을 이용, 암호화된 문자열을 생성해낸 뒤 이를 클라이언트의 쿠키에 아이디와 함께 저장해 둡니다. 바로 이 아이디와 암호화된 문자열이 키값이 되어 로그인 여부를 판단하게됩니다. 여기까지 자동로그인 세팅이 끝난 상태입니다. 이제 브라우저를 새로 열고 다시 접속했을 때 의 상황입니다. 먼저 사용자의 쿠키에 들어있는 아이디로 사용자 테이블에 저장되어있는 키값을 검색합니다. 키값이 없다면 자동로그인 하지 않은 상황이므로 여기서 수행을 멈춥니다.(로그인 되지 않은 상태) 키값이 있다면 키값을 가지고 MD5알고리즘으로 문자열을 생성한 뒤 이것이 쿠키에 저장되어있는 문자열과 일치하면 자동으로 로그인되도록 처리합니다. 로그 아웃시에는 DB에있는 사용자정보의 자동로그인용 키값을 삭제하여 자동로그인이 되지 않도록 합니다.

 

MD5 알고리즘에 필요한 소스(상단 첨부파일 참고)

1. MD5 암호화 클래스 ( SecurityUtil.java )

2. Base64 인코딩 클래스 ( Base64Util.java )

출처 : http://www.javapattern.info/50

 

로그인시 자동로그인 체크박스가 체크되어있을 때 처리 부분
if(자동로그인체크박스가 체크되어 있는가?){
    String MD5String = "";
    String MD5Key    = "";
    try{

        // 랜덤한 키값을 생성(여기서는 5문자를 생성함)

        StringBuffer sbKey = new StringBuffer();
        while(sbKey.length() < 5){
            sbKey.append((char)((Math.random() * 26) + 65));
        }
        MD5Key    = sbKey.toString();
        MD5String = SecurityUtil.getCryptoMD5String(MD5Key);
    }catch(Exception e) {
        Logger.err.println(e.toString());
    }
   

    // 쿠키에 아이디 저장
    Cookie alIDCookie = new Cookie("LB_AUTOLOGIN_ID", authEntity.USER_ID);
    alIDCookie.setMaxAge(2592000);    // 한달간 저장(최대 자동로그인 기간은 한달)
    response.addCookie(alIDCookie);
   

    // 쿠키에 암호화된 문자열 저장
    Cookie alKeyCookie = new Cookie("LB_AUTOLOGIN_MD5", MD5String);
    alKeyCookie.setMaxAge(2592000);
    response.addCookie(alKeyCookie);
   
    // MD5 키값을 DB에 저장
    (유저테이블등 사용자 정보가 있는 테이블에 알아서 넣으시길...)

 

 

재 로그인시 자동로그인여부를 확인하여 로그인을 처리하는 부분

각 페이지 마다 권한체크하는 부분에 인클루드하여 사용합니다.

if(로그인이 되어있는가?){

    // ...

}else{

    // 쿠키값을 체크.
    String strALID = "";
    String strALMD5 = "";
    Cookie[] cookies = request.getCookies();
    if(cookies != null){
        for (int i = 0; i < cookies.length; i++) {
            Cookie thisCookie = cookies[i];
            if ("LB_AUTOLOGIN_ID".equals(thisCookie.getName())) strALID = thisCookie.getValue();
            if ("LB_AUTOLOGIN_MD5".equals(thisCookie.getName())) strALMD5 = thisCookie.getValue();
        }
    }

 

    if(쿠키에 값이 없으면?){

        // 자동로그인이 아니므로 그냥 패스.

    }else{

        // 가져온 쿠키의 아이디로 사용자 테이블에 저장된 MD5 키값을 가져옴.
        (유저테이블등 사용자 정보가 있는 테이블에서 알아서 가져오시길...)

 

        if(strALKey != null && strALMD5.equals(SecurityUtil.getCryptoMD5String(strALKey))){

            // 로그인 정보 일치

            // 쿠키정보를 업데이트한다(쿠키 저장기간이 한달로 지정되어 있으므로 그냥 두면 한달 뒤에 끊겨버림. 새로 갱신.)
            Cookie[] cookiesDel = oRequest.getCookies();
            for (int i = 0; i < cookiesDel.length; i++) {
                Cookie thisCookie = cookiesDel[i];
                if ("LB_AUTOLOGIN_ID".equals(thisCookie.getName()) || "LB_AUTOLOGIN_MD5".equals(thisCookie.getName())) {
                    thisCookie.setMaxAge(2592000);    // 한달간 저장
                    response.addCookie(thisCookie);
                }
            }
           
            // 로그인 수행
            (로그인 수행 작업은 각자 알아서 하시길...)


        }else{
            // 로그인 정보 불일치, 쿠키 삭제
            Cookie[] cookiesDel = request.getCookies();
            for (int i = 0; i < cookiesDel.length; i++) {
                Cookie thisCookie = cookiesDel[i];
                if ("LB_AUTOLOGIN_ID".equals(thisCookie.getName()) || "LB_AUTOLOGIN_MD5".equals(thisCookie.getName())) {
                    thisCookie.setMaxAge(0);
                    response.addCookie(thisCookie);
                }
            }

        }

    }

}.

 

결론

자동로그인은 역시 보안상 좋지 않은것 같습니다. 그러나 없으면 짜증나는... 암튼 제 머리는 여기까지입니다. 좀 더 효과적인 방법이 있으신 분들은 아이디어 부탁드립니다.