자바 자동로그인 구현
자바 자동로그인 구현
개요
자동로그인은 보안문제가 가장 큰 이슈거리죠. 그래서 포탈등에서는 아예 사용을 하지 않고 있습니다. 하지만 제 홈페이지는 규모상 큰 문제가 없을것 같고, 편리함이 더욱 큰지라 넣어 보게 되었습니다. 먼저 인터넷에서 자동로그인 방법에 대해 여기저기 찾아봐도 명확한 답을 찾을 수가 없었습니다. 순전히 개인적인 생각으로 구현해 보았으니 문제가 될 부분이 있다면 가차없는 코멘트 부탁드립니다.
시나리오
자동로그인 체크박스에 체크를 하고 로그인을 하면 일정한 길이의 랜덤한 문자열을 생성하여 사용자정보(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);
}
}
}
}
}.
결론
자동로그인은 역시 보안상 좋지 않은것 같습니다. 그러나 없으면 짜증나는... 암튼 제 머리는 여기까지입니다. 좀 더 효과적인 방법이 있으신 분들은 아이디어 부탁드립니다.