티스토리 뷰

문제

로그인을 했을경우, 이미 인증을 받았기에 필터와 인터셉트가 걸러주지 못하는 문제 발견
/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;
    }
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함