[java] 서블릿에서의 로그인과 인증 처리

서블릿은 웹 애플리케이션 개발에서 많이 사용되는 기술 중 하나입니다. 이번 글에서는 서블릿에서 로그인과 인증 처리에 대해 알아보겠습니다.

1. 로그인 기능 구현하기

로그인은 사용자가 애플리케이션에 접속하여 자신의 계정으로 인증하는 과정입니다. 서블릿에서는 일반적으로 아래와 같은 절차를 따릅니다.

  1. 클라이언트에서 아이디와 비밀번호를 서버로 전송합니다.
  2. 서버에서 받은 아이디와 비밀번호를 확인하여 유효한 사용자인지 검증합니다.
  3. 검증이 성공하면, 사용자를 로그인 상태로 설정합니다.
  4. 로그인 상태를 유지하기 위해 세션에 사용자 정보를 저장합니다.

아래는 위 절차를 구현한 예시 코드입니다.

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        // 아이디와 비밀번호 검증 로직
        if (username.equals("admin") && password.equals("password")) {
            // 로그인 성공
            HttpSession session = request.getSession();
            session.setAttribute("loggedInUser", username);
            response.sendRedirect("/home");
        } else {
            // 로그인 실패
            response.sendRedirect("/login.html");
        }
    }
}

위 코드에서는 doPost() 메서드를 통해 클라이언트로부터 받은 아이디와 비밀번호를 검증하여 로그인 성공 여부를 판단합니다. 로그인 성공 시 HttpSession을 사용하여 세션에 사용자 정보를 저장하고, /home으로 리다이렉트합니다. 로그인 실패 시 /login.html로 리다이렉트됩니다.

2. 인증 처리하기

로그인 후에는 인증된 사용자가 특정 페이지에 접근할 수 있는지를 검사해야 합니다. 일반적으로 서블릿 필터를 사용하여 인증 처리를 구현합니다.

아래는 실제 로그인 상태인지를 검사하는 필터의 예시 코드입니다.

@WebFilter("/*")
public class AuthFilter implements Filter {
  
    private static final List<String> allowedUrls = Arrays.asList("/login", "/login.html");

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        
        String url = httpRequest.getServletPath();

        // 로그인 페이지는 인증 처리를 하지 않음
        if (allowedUrls.contains(url)) {
            chain.doFilter(request, response);
            return;
        }
        
        // 인증된 사용자인지 확인
        HttpSession session = httpRequest.getSession(false);
        if (session != null && session.getAttribute("loggedInUser") != null) {
            chain.doFilter(request, response);
        } else {
            // 인증되지 않은 사용자는 로그인 페이지로 리다이렉트
            httpResponse.sendRedirect("/login.html");
        }
    }
}

AuthFilter는 모든 요청에 대해 호출됩니다. allowedUrls에는 인증을 처리하지 않아도 되는 URL을 등록해 놓습니다. 인증되지 않은 사용자는 인증 처리를 하지 않은 상태로 접근하지 못하도록 리다이렉트됩니다.

3. 참고 자료