Back-End/Java

Spring, Java 웹 사이트 세션(Session) 관리하기(웹 사이트 로그인 기능, 웹 사이트 session, 웹 로그인 처리)

개발자 DalBy 2024. 5. 14. 13:54
반응형

Spring, Java 웹 사이트 세션(Session) 관리하기(웹 사이트 로그인 기능, 웹 사이트 session, 웹 로그인 처리)

Spring, Java를 활용하여 웹 사이트의 Session을 관리하는 class를 작성하여 로그인 기능을 구현하는 방법에 대해 포스팅 하겠습니다.

 

spring에서의 Session은?

session은 클라이언트(브라우저)와 서버(웹 애플리케이션)의 소통으로 세션을 통해 서버는 여러 HTTP 요청에 걸쳐 특정 사용자에 대한 데이터를 유지할 수 있습니다.

웹 애플리케이션에서 session은 주로 HTTP session을 통해 관리됩니다. 사용자가 Spring 기반 웹 애플리케이션에 액세스하면 해당 사용자에 대한 고유한 session 개체가 생성됩니다. 이 session 개체는 일반적으로 사용자의 웹 브라우저에 쿠키로 저장되는 session ID로 식별됩니다. session ID를 사용하면 서버는 동일한 사용자의 후속 요청을 올바른 session과 연결할 수 있습니다.

※spring 참고사항
spring의 HttpSession은 표준 Servlet API의 일부인 인터페이스를 통해 session 관리에 대한 지원을 제공합니다. 사용자 인증 세부 정보, 쇼핑 페이지의 장바구니 항목 또는 기타 관련 데이터를 세션에 저장할 수 있습니다.

 

먼저 바로 확인 가능한, 브라우저의 관리자 모드에서

세션 스토리지 정보를 보면 여러 데이터 정보가 들어있는 것을 확인 할 수 있다.

 

즉 특정 정보가 session으로 관리되는 웹 페이지를 접속하여 로그인 하면, 해당 정보가 들어있는 것을 확인 할 수 있다.

간단한 로그인 처리 기능을 구현하면 아래 코드와 같다.

 

간단한 로그인 기능 코드

private static final Logger LOG = LoggerFactory.getLogger(SessionUtil.class);
    public static final String LOGIN_USER_INFO = "USER_INFO"; // 담을 데이터

    // 로그인 성공 시 세션 부여
    public static Boolean setLoginSuccess(UserDTO param) {
        try {
            LOG.debug("Login Info : "+ param.toString());
            getSession().setAttribute(LOGIN_USER_INFO, param);
            getSession().setMaxInactiveInterval(1800); // 유지시간
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    // 세션 정보 return
    public static HttpSession getSession() {
        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
        return attr.getRequest().getSession();
    }

    // 로그인 체크
    public static Boolean isLogin() {
        if(getSession().getAttribute(LOGIN_USER_INFO) == null) {
            return false;
        } else {
            return true;
        }
    }

    // 로그아웃 처리
    public static void logout() {
        getSession().invalidate();
    }

    // 로그인 정보 return
    public static UserDTO getUser() {
        if(isLogin()) {
            return (UserDTO)getSession().getAttribute(LOGIN_USER_INFO);
        } else {
            return null;
        }
    }

maxInactiveInterval: 초 단위 유지 설정 (30분, 1800초)

UserDTO의 경우 DB 데이터 조회 성공시(로그인) 사용 할 정보 주입 

 

Controller 예시 (로그인 / 로그아웃)

	// 로그인
    @RequestMapping(value = "/selectUser")
    @ResponseBody
    public UserDTO selectUser(Model model, HttpServletRequest req, HttpServletResponse res,
                              @RequestBody UserDTO paramDTO) throws Exception {
        return mainHomeService.selectSessionUser(paramDTO);
    }

    // 로그아웃
    @RequestMapping(value = "/logout")
    @ResponseBody
    public int logoutCheck(Model model, HttpServletRequest req, HttpServletResponse res,
                           @RequestBody UserDTO paramDTO){
        try{
            SessionUtil.logout();
        } catch (Exception e){
            LOG.info("SessionUtil.logout() " + e.getMessage());
            SessionUtil.logout();
        }
        return 1;
    }

 

selectUser 메소드에서 입력한 로그인 정보가 존재 하는지 체크한다.(DB 조회)

 

logoutCheck 메소드에서 호출되는 logout() 메소드는

getSession().invalidate(); 호출하여, 인증된 세션 상태를 무효 처리한다. (로그아웃)

 

적용 예시 로그인 (우측 상단 바) 로그아웃 상태

로그인 전 테스트
로그인 전 테스트

 

적용 예시 로그인 (우측 상단 바) 로그인 상태

로그인 후 테스트
로그인 후 테스트

 

다양한 세션 활용

인터셉터에서 로그인 체크 및 개인 유저 ,관리자 유저 등등 체크하여 상황에 필요한 처리를 추가한다.

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String requestUrl = request.getRequestURI();
    
    // 로그인 상태 체크
    if(SessionUtils.isLogin()){ // (로그인)
        
        String userId = SessionUtils.getUser().getUserId();
        
        if(requestUrl.contains("/system")){
        
            if("admin".equals(userId)){
                 return true;
            } else {
                response.sendRedirect("/index.do")
                return false;
            }
            
        } else {
            return true;
        }

    } else { // URL 접속 거부 (로그아웃)
        response.sendRedirect("/index.do")
        return false;
    }
    
}

 

 

 

마지막으로

간단하게 웹사이트의 로그인을 구현하고, 여러 페이지에서 사용자 정보를 다양한 화면에서 활용할 수 있습니다. 요즘은 session을 다이렉트로 사용하여 처리하는 것 보다, 인증 토큰 방식을 활용한 인증 방식을 많이 사용하고 있습니다. 대표적으로 JWT(json web token)를 활용한 OAuth정도가 있겠습니다. 그리고 Single Sign-On이라는 SSO를 활용하여 하나의 애플리케이션에 로그인하면 다른 애플리케이션에 추가적인 인증없이, 한 번의 인증으로 동일하게 사용자 정보 데이터를 사용할 수 있는 SSO도 많이 사용되고 있습니다.

 

 



반응형