ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [트러블 슈팅] 로그인 인증 관련 문제
    프로젝트/게시판 프로젝트 2024. 10. 29. 18:03

    문제

    로그인을 했을경우, 이미 인증을 받았기에 필터와 인터셉트가 걸러주지 못하는 문제 발견
    /members/test -> /members/admin (이동 가능)

     

    문제의 코드

    • session의 null 체크만 하고, 로그인 계정에 대한 인증 로직이 추가되지 않음
      • 위의 문제가 발생한 원인
     @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
            String requestURI = request.getRequestURI();
            Pattern pattern = Pattern.compile("/members/([^/]+)");
            Matcher matcher = pattern.matcher(requestURI);
    
    
            log.info("인증 체크 인터셉트 실행 {}", requestURI);
            HttpSession session = request.getSession(false);
    
            if(session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
                log.info("미인증 사용자 요청");
    
                response.sendRedirect("/members/login?redirectURI=" + requestURI);
                return false;
            }
            
            return true;
        }

     

     

    수정된 코드

    • account 계정을 url에서 파싱한 후에, session에 저장되어있는 아이디와 매칭
      • 없으면, /members/login으로 이동
    • 주의할점)
      • url 매칭을 두번째 섹션에 계정명을 사용해야한다
        • ex) memebers/[계정명]
        • 만약에 다른 url로 설정할경우, 인터셉트에 의해서 로그인화면으로 돌아가는 이슈가 존재할 수 있다 (* 이부분은 차후에 생각..)
    @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
            String requestURI = request.getRequestURI();
            Pattern pattern = Pattern.compile("/members/([^/]+)");
            Matcher matcher = pattern.matcher(requestURI);
    
    
            log.info("인증 체크 인터셉트 실행 {}", requestURI);
            HttpSession session = request.getSession(false);
    
            if(session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
                log.info("미인증 사용자 요청");
    
                response.sendRedirect("/members/login?redirectURI=" + requestURI);
                return false;
                
            }else if(matcher.find()){
                String account = matcher.group(1);
    
                Member authAccount = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER);
    
                if (authAccount.getLoginId() == null ||  !authAccount.getLoginId().equals(account)){
                    response.sendRedirect("/members/login?redirectURI="+requestURI);
                    log.info("Session loginId: {}, URL account: {}", authAccount.getLoginId(), account);
                    return false;
                }
    
            }else{
                response.sendRedirect("/errors/custom/404");
                log.info("Not matcher loginId, Error 404!");
                return false;
            }
    
            return true;
        }
Designed by Tistory.