티스토리 뷰

Spring&Spring Boot/JSP

Cookie

on1ystar 2019. 1. 23. 20:53
728x90
반응형
본 글의 목적은 제가 공부한 내용을 바탕으로 정리하면서 저와 같이 공부하시는 분 들을 위함입니다. 때문에 부족한 부분이 있을 수 있고, 잘못된 부분이 있을 수 있습니다. 만약 있을 경우, 생각을 고칠 수 있도록 저에게 알려주시면 정말 감사하겠습니다 !!



Cookie ?


HTTP 프로토콜의 특징중 하나는 클라이언트가 서버에 request를 하면 서버가 여러 작업을 마친뒤, 클라이언트에게 response를 해줍니다. 이렇게 요청과 응답이 한 번 돌면 클라이언트와 서버의 연결에 해지된다는 점입니다.


어떤 웹 사이트의 서버가 있다고 생각해 보면, 그 웹 사이트를 접속하는 클라이언트는 수도 없이 많을 거고, 그 클라이언트들이 서버에 요청하는 것 역시 많겠죠? 

따라서 그 연결들을 계속 유지하고 있으면 서버에 상당한 과부하가 걸릴 수 있기 때문에 서버가 한 번 응답을 한 뒤에 그 클라이언트와의 연결을 해지하여 리소스를 반납하는 것이 HTTP 프로토콜의 특징입니다. 때문에 효율적으로 클라이언트와의 연결을 할 수 가 있습니다.

하지만, 연결을 계속 유지시켜 주길 원하는 데이터들이 있습니다. 예를들어 로그인 정보같은 경우, 만약 로그인을 했는데 연결을 해지해서 로그인이 유지되지 않으면 아무 의미가 없어집니다.

장바구니 시스템도 마찬가지입니다. 사고싶은 물건들을 장바구니에 담는 요청을 한 뒤 나중에 확인해보면, 서버는 요청을 응답하고 연결을 해지했기 때문에 나중에 그 클라이언트가 어떤 물건을 담았는지 알고 싶지도, 알 수도 없습니다.

이러한 문제를 해결하기 위해 쿠키를 사용하는 것입니다.

Cookie는 단어 그대로 과자 쿠키에서 가져온 말입니다. 우리가 쿠키를 먹을 때 부스러기 같은 게 많이 나와서 흘리곤 합니다. 그 흘린 부스러기 때문에 거기에 흔적이 남게 되죠. 이 흔적을 이용하는 겁니다.

(https://learning.oreilly.com/library/view/using-google-app/9780596802462/ch07.html)

서버가 클라이언트에게 응답을 할 때 클라이언트의 브라우저에 쿠키를 남기게 됩니다. 그러면 해당 클라이언트의 브라우저는 이 쿠키를 정해진 기간동안 가지고 있다가 다음에 같은 서버에 요청을 할 때 이 쿠키의 정보와 같이 요청을 합니다.

서버는 쿠키의 정보를 가지고 전에 이 클라이언트와 했던 요청, 응답 등의 데이터들을 이용할 수 있게 되는 것입니다.


Cookie 구현


login.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%
    Cookie[] cookies = request.getCookies();
    System.out.println("cookies : " + cookies);
    
    if(cookies != null){
        for(Cookie c : cookies){
            if(c.getName().equals("userID")){
                response.sendRedirect("loginOK.jsp");
            }
        }
    }
%>
    <form action="loginCon" method="post">
        ID : <input type ="text" name="userID"><br>
        PW : <input type ="password" name="userPW"><br>
        <input type="submit" value="login">
    </form>
cs

우선 클라이언트에게 보여질 로그인 페이지입니다. 아래에 form 태그로 간단한 login 양식을 만들었습니다.

위의 코드가 중요한데, 먼저 Cookie[] 배열 객체를 만듭니다. 배열로 만드는 이유는 클라이언트와의 쿠키가 하나가 아닐 수 있고, 실재로 여러 개기 때문입니다.

그 배열 객체에 repuest.getCookies() 메소드로 해당 클라이언트 브라우저의 쿠키들을 담습니다.

만약 이 cookies가 null이라면 이 클라이언트와의 연결이 처음이라는 것이기 때문에 로그인 폼을 보여주고, null이 아니라면  브라우저의 쿠키에 로그인 정보를 가지고 있는 쿠키가 있는지 검사합니다. 정보가 있다면 loginOk.jsp 페이지로 응답하고, 없으면 마찬가지로 로그인 폼을 보여줍니다.

LoginCon.java

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
32
33
34
@WebServlet("/loginCon")
public class LoginCon extends HttpServlet {
 
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
        PrintWriter out = response.getWriter();
        
        String userID = request.getParameter("userID");
        String userPW = request.getParameter("userPW");
        
        out.print("userID : " + userID);
        out.print("userPW : " + userPW);
        
        Cookie[] cookies = request.getCookies();
        Cookie cookie = null;
        
        for(Cookie c : cookies) {
            System.out.println("c.getName() : " + c.getName() + "c.getValue() : " + c.getValue() );
            
            if(c.getName().contentEquals("userID")) {
                cookie = c;
            }
        }
        if(cookie == null) {
            System.out.println("cookie is null");
            cookie = new Cookie("userID", userID);
        }
        
        response.addCookie(cookie);
        cookie.setMaxAge(60*60);
        
        response.sendRedirect("loginOk.jsp");
    }
cs

로그인 연결 처리를 하는 서블릿입니다.

사용자가 입력한 값들을 String 객체에 담습니다. 그리고 역시 쿠키 배열 객체에 브라우저 쿠키 정보들을 담고, 따로 쿠키를 하나 만들어줍니다.

여기서도 for문을 통해 브라우저의 쿠키들을 확안하는데, 일단 확인을 위해 쿠키들의 이름과 값들을 출력해줍니다.

그런 다음 만약 쿠키에 userID가 있으면 그 쿠키를 아까 만들어 놓은 쿠키에 담습니다. (사실 이 부분은 login.jsp에서 처리했던 부분이라 중복검사가 되는 느낌이 있습니다.)

cookie가 그대로 null 이라면, 이름이 userID, 값이 사용자가 입력한 userID 변수 값인 쿠키를 새로 만들어줍니다.

그 쿠키를 response.addCookie() 메소드를 이용해 클라이언트 브라우저에 응답합니다. setMaxAge는 쿠키가 유효한 시간을 지정해주는 메소드로 초단위이기 때문에 60*60은 1시간이 됩니다.

마지막으로 loginOk.jsp로 클라이언트를 sendRerirect 합니다.

loginOk.jsp

1
2
3
4
5
6
7
8
<%
    Cookie[] cookies = request.getCookies();
    for(Cookie c : cookies){
        out.print("name : " + c.getName() + "<br>");
        out.print("value : " + c.getValue() + "<br>");
        out.print("--------------------------------" + "<br>");
    }
%>
cs

여기서는 간단하게 쿠키의 정보를 출력해 주도록 했습니다.


서버를 실행시켜 보니 처음에 cookies가 null이라고 알려줍니다.


값을 입력해 보겠습니다.


loginOk.jsp페이지로 이동되면서 쿠키의 정보들이 출력되는데요, 처음에 보이는 쿠키는 브라우저가 자체적으로 만들어준 쿠키입니다.

제가 입력한 정보는 아래에 출력됩니다. 


이상태에서 login.jsp 페이지로 이동하려고 하면 


다시 loginOk.jsp로 돌아옵니다. 

이는 아까 코드에서 봤듯이 login.jsp에서 쿠키의 검사를 통해 이미 로그인정보를 가지고 있는 쿠키가 생성되어 있는 상태이기 때문입니다.




728x90
반응형

'Spring&Spring Boot > JSP' 카테고리의 다른 글

Session  (0) 2019.01.24
Servlet 데이터 공유  (1) 2019.01.22
JSP 내장객체  (0) 2019.01.21
JSP request, response  (0) 2019.01.20
JSP 스크립트  (0) 2019.01.19
댓글