spring으로 로그인 및 로그아웃 처리를 할 때는 spring Security를 사용할 수 있다. 로그인, 로그아웃, 권한 검사 등을 해주어 권한마다 접근할 수 있는 페이지를 지정해줄 수 있다. 이것을 사용하기 위해선 spring security를 이해하는 것이 필요한데, 사용하기 위해서 공부해보았지만 어려워서 포기했다. 대신, 비슷하게나마 구현해보았다.
먼저 로그인과 로그아웃에 관련된 것을 정리해두겠다. 권한 검사는 이외의 것들을 다 한 후에 적용할 예정이라서, 추후에 추가로 작성하겠다.
로그인, 로그아웃 그리고 로그인시 세션에 저장해둔 정보들을 가져오는 메소드들이다. 모두 static한 메소드로 구성되어 있다.
파라미터로는 HttpServletRequest를 보내주는데, 로그아웃 할 때 session객체를 초기화 하게 되는데 이 때 request가 필요해서 모든 파라미터를 통일성 있게 맞춰주었다.
작성한 코드가 궁금하다면, 이 글을 펼치세요.
package kr.coo.happysue.web.util;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import kr.coo.happysue.member.MemberDTO;
public class MemberInfoSession {
public static final String MEMBER_ID = "member_memberId";
public static final String NAME = "member_name";
public static final String AUTH = "member_auth";
public static final String AUTH_NAME = "member_auth_name";
public static void login(HttpServletRequest request, MemberDTO member) {
HttpSession session = request.getSession();
//표출되는 권한 명칭 설정
String authName = "게시판 관리자";
if ( member.getAuth().equals("ADMINISTRATOR") ) {
authName = "전체관리자";
}
//회원정보 셋팅
session.setMaxInactiveInterval(1800); // 1800 = 60s*30 (30분)
session.setAttribute(MEMBER_ID, member.getMemberId());
session.setAttribute(NAME, member.getName());
session.setAttribute(AUTH, member.getAuth());
session.setAttribute(AUTH_NAME, authName);
}
public static void logout(HttpServletRequest request) {
request.getSession().invalidate();
request.getSession(true);
}
public static boolean isLogin(HttpServletRequest request) {
HttpSession session = request.getSession();
if (null == session.getAttribute(MEMBER_ID)) {
return false;
}
return true;
}
public static String getId(HttpServletRequest request) {
String value = (String) request.getSession().getAttribute(MEMBER_ID);
if (value == null) {
return "";
}
return value;
}
public static String getName(HttpServletRequest request) {
String value = (String) request.getSession().getAttribute(NAME);
if (value == null) {
return "";
}
return value;
}
public static String getAuth(HttpServletRequest request) {
String value = (String) request.getSession().getAttribute(AUTH);
if (value == null) {
return "";
}
return value;
}
public static String getAuthName(HttpServletRequest request) {
String value = (String) request.getSession().getAttribute(AUTH_NAME);
if (value == null) {
return "";
}
return value;
}
}
권한
- 전체 관리자 > 게시판 관리자
- 세션에 저장되는 회원정보 : 아이디, 이름, 권한, 권한 명칭
로그인
public static void login(HttpServletRequest request, MemberDTO member) {
//1) 세션 가져오기
HttpSession session = request.getSession();
//2) 표출되는 권한 명칭 설정
String authName = "게시판 관리자";
if ( member.getAuth().equals("ADMINISTRATOR") ) {
authName = "전체관리자";
}
//3) 세션 유지시간 설정
session.setMaxInactiveInterval(1800); // 1800 = 60s*30 (30분)
//4) 회원정보 설정
session.setAttribute(MEMBER_ID, member.getMemberId());
session.setAttribute(NAME, member.getName());
session.setAttribute(AUTH, member.getAuth());
session.setAttribute(AUTH_NAME, authName);
}
로그인은 웹 페이지 사용 시 지속적으로 필요한 정보들을 저장한다. 아이디, 이름, 권한, 권한 명칭 정도만 저장했다.
1) request에서 세션을 가져온다.
2) 권한 명칭은 따로 DB에 저장하지 않아서 로그인 시 설정해주었다.
3) 세션 유지시간은 30분으로 설정했다. 30분 동안 사용자의 요청이 없으면 세션은 만료되어 자동 로그아웃처리가 된다.
4) 특정한 이름으로 세션에 저장한다. 세션에 저장할 변수명은 상수로 설정했다. 변수명을 수정하고 싶을 때 편리하게 수정할 수 있을 것 같다는 생각이 들어서다.
로그아웃
public static void logout(HttpServletRequest request) {
request.getSession().invalidate();
request.getSession(true);
}
로그아웃은 매우 간단하다. 코드 두줄이면 끝난다. invalidate()로 현재 사용하고 있는 세션을 무효화한다. 그리고 getSession(true)를 통해서 새로운 세션ID를 발급해준다. 이렇게 처리하여 세션을 초기화 할 수 있다.
인터넷을 찾아보면 invalidate()만 많이 나와있던데, 이 방식으로 하면 이번 요청에서는 session을 무효화 처리 할 수 있지만, 사용자가 요청을 또 보내면 모든 정보가 그대로 남아있다. 그렇기 때문에 저 두 줄의 코드는 모두 작성해 주어야 한다.
세션에 저장되는 회원정보는 모두 getter를 통해서 가져올 수 있다. 이것은 간단하므로 설명을 생략하겠다.
참조
로그아웃
https://stackoverrun.com/ko/q/4330369
댓글