[Servlet] encodeURL()

Bam·2024년 5월 12일
0

Spring

목록 보기
28/48
post-thumbnail

특정 브라우저에 들어갔을 때 '이 페이지에서 쿠키를 사용하도록 허가하시겠습니까?'라는 안내 문구를 보신 적 있나요? 이는 웹 페이지에서 사용자 정보 수집을 위해 쿠키를 사용하도록 허가를 받는 과정인데요. 쿠키를 저장하면 재접속시 성능 향상이나 특정 행동 기억을 통해 여러 편의기능을 제공받을 수 있게 됩니다.

하지만 쿠키가 많이 쌓이는 경우 종종 문제가 발생하거나 쿠키 자체가 보안성이 낮기 때문에 쿠키를 차단하는 일이 생기게 됩니다. 저도 위와 같은 질문이 발생하면 쿠키는 허용하지 않고 차단하거나 어쩔 수 없는 경우에 필수 쿠키만 허용하는 식으로 쿠키를 차단하고 있습니다.

문제는 여기서 발생하게 됩니다.

쿠키야 그렇다 치고, 로그인에 주로 사용되는 세션 또한 세션 쿠키라는 쿠키를 이용하기 때문에 쿠키를 완전 차단한 클라이언트의 경우에는 세션 기능도 제대로 사용할 수 없게 됩니다.

따라서 이런 경우에는 encodeURL()이라는 메소드를 사용해서 세션 기능을 구현하게 됩니다.


encodeURL()

encodeURL()은 호출하게 되면 서버에서 직접 클라이언트(브라우저)로 응답을 먼저 보냅니다. 그 후 URL Rewiriting 기술을 사용하여 jsessionId를 서버로 전송함으로써 세션 기능을 구현합니다. 이렇게하면 세션 쿠키를 사용하지 않아도 세션 기능을 사용할 수 있게 됩니다.

먼저 로그인 폼을 작성합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
<form name="loginForm" method="post" action="encodeLogin" enctype="UTP-8">
    <fieldset>
        <legend>Login</legend>
        <label>아이디: </label>
        <input type="text" name="id"><br/>
        <label>비밀번호: </label>
        <input type="text" name="password"><br/>
        <input type="submit" value="login">
    </fieldset>
</form>
</body>
</html>

다음으로 로그인 상태를 확인할 서블릿을 작성합니다.

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;

import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/encodeLogin")
public class encodeURLLoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doHandle(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doHandle(req, resp);
    }

    private void doHandle(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");

        PrintWriter out = resp.getWriter();

        HttpSession session = req.getSession();

        String id = req.getParameter("id");

        if (session.isNew()) {
            if (id != null) {
                session.setAttribute("id", id);
                
                //encodeURL() 메소드를 사용해서 응답시에 jsessionId를 저장
                String url = resp.encodeURL("encodeLogin");
                
                //링크 클릭시 저장된 jsessionId를 서블릿으로 전송
                out.print("<a href=" + url + ">로그인 확인</a>");
            }
            else {
                out.print("<a href='login.html'>다시 로그인</a>");
                session.invalidate();
            }
        }
        else {
            id = (String) session.getAttribute("id");
            out.print("로그인한 사용자: " + id);
        }
    }
}

특히 주목해야할 곳은 encodeURL()를 사용하는 부분입니다.

//encodeURL() 메소드를 사용해서 응답 시 jsessionId를 저장
String url = resp.encodeURL("encodeLogin");
                
//링크 클릭시 저장된 jsessionId를 서블릿으로 전송
out.print("<a href=" + url + ">로그인 확인</a>");

encodeURL() 메소드를 통해서 세션 쿠키 대신 응답 시 jsessionId를 미리 저장하도록 하고, 링크를 클릭하게 되면 저장해둔 jsessionId를 서블릿에 전송하도록 함으로써 세션 쿠키 없이 세션을 구현하도록 하는 것 입니다.

기존 세션 방식에서는 세션 쿠키를 이용하기 때문에 링크를 통해 바로 요청하도록 작성했었습니다.

session.setAttribute("id", id);
out.print("<a href='sessionLogin'>로그인 확인</a>");

로그인 결과 창 링크에 jsessionId가 전송된 것을 확인할 수 있습니다.

0개의 댓글