쿠키, 세션

2019. 5. 16. 19:48JSP&Servlet

HTTP 프로토콜 특징

  1. HTTP 프로토콜은 기본적으로 클라이언트의 요청(request) 응답(response)로 구현됨.
  2. 서버에 요청을 하고 응답을 받으면 서버와의 통신이 끊기게 됨.
  3. HTTP는 비연결형 프로토콜이라고 한다.

장점

  1. 프로토콜을 직관적으로 이해하기 쉽고, 구현이 단순함
  2. 클라이언트의 요청에 대한 처리 결과를 응답으로 전송하고 나면 접속이 종료되기 떄문에 더 많은 클라이언트의 요청을 처리 할 수 있다.

단점

  1. 각 클라이언트 요청마다 새로운 접속이 이루어지기 떄문에 서버측에 네트워크 자원의 낭비가 적지만, 새로운 접속을 맺기 위해 발생하는 오버헤드 즉, 수행속도의 감소가 지속적으로 발생
  2. 동일한 클라이언트가 접속하더라도, 이전의 정보가 남아있지 않아서 클라이언트의 정보에 대한 비교가 불가능

STEP 01 . 쿠키

  1. HTTP 프로토콜은 상태가 없다. 즉 이전에 무엇을 했고, 지금 무엇을 했는지에 대한 정보를 갖고 있지 않는 특성을 가지고 있다. 즉, 웹 브라우저(클라이언트)의 요청에 대한 응답을 하고 나면 해당 클라이언트와의 연결을 지속하지 않는다.
  2. HTTP 프로토콜은 상태에 대한 지속적인 연결이 없다. 따라서 이런 부분을 해결하기 위해서 웹 서버 측에 웹 브라우저의 정보를 저장한 후 계속되는 웹브라우저의 요청 속에 포함되어 있는 웹 브라우저의 정보와 비교해서 동일한 웹 브라우저로부터 온 요청을 판단할 수 있다.
  3. 쿠키(Cookie)는 상태가 없는 프로토콜을 위해 상태를 지속시키기 위한 방법이다. 쿠키는 웹 브라우저의 정보를 웹 브라우저에 저장하므로, 이후에 서버로 전송되는 요청에는 쿠키가 가지고 있는 정보가 같이 포함돼 전송된다. 이때 웹 서버는 웹 브라우저의 요청 속에 포함되어 있을 쿠키를 읽어서 새로운 웹 브라우저인지 이전에 요청을 했던 웹 브라우저인지를 판단할 수 있다.
  4. 쿠키는 웹 사이트에 접속할 때 생성되는 정보를 담은 임시 파일이다. 일반적으로 쿠키는 4KB 이하의 크기로 생성된다. 이러한 쿠키의 목적은 원래 사이트에 접속한 사용자의 정보를 유지하거나, 사이트에 접속하는 사용자들이 해당 사이트에 쉽게 접속하기 위한 것이다.
  5. 어떤 웹 사이트를 처음 방문해서 로그인해 사용하고나면, 아이디와 패스워드를 기록한 쿠키가 만들어진다.그 다음 부터 해당 사이트에 접속하면 별도의 절차 없이 사이트에 빠르게 연결할 수 있게 된다. 쿠키는 이러한 목적으로 사용하기 위해 만들어진 것이다.
  6. 웹 사이트에 대한 정보 및 개인의 정보가 기록되기 때문에 개인의 사생활이나 정보를 침해할 소지가 있다는 문제점을 안고 있다. 이러한 보안상의 문제를 조금이나마 해소하기 위해서 웹 브라우저 자체에 쿠키 거부 기능이 추가되었다.
    <첨부 http://itmore.tistory.com/entry/JSP-%EC%BF%A0%ED%82%A4Cookie-%EC%A0%95%EB%A6%AC-%EB%B0%8F-%EC%98%88%EC%8B%9C>

 

<첨부 http://hyeonstorage.tistory.com/114>

 

STEP 02 . 쿠키 사용하기

//쿠키 사용하기

Cookie 변수 = new Cookie(이름, 값);

    // 쿠키는 저장하는 값과 거기에 붙이는 이름이 세트로 되어 있음.

//쿠키 저장하기

response.addCookie(변수);

 

//쿠키 받아오기

Cookie[] cookie = request.getCookie();

    // 특정 쿠키만을 얻어오는 기능이 없음. 전체를 받아야 하기 떄문에 배열로 얻는다.

//유효기간 설정하기

cookie.setMaxAge(초);

    // 쿠키가 언제까지 저장될지 설정. 설정하지 않을 경우 브라우저 종료시 그 시점에 쿠키 사라짐.

/cookie/Ex01_Cookie.java

package cookie;

 

import java.io.IOException;

 

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

@WebServlet("/ex01_cookie.do")

public class Ex01_Cookie extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

         

        Cookie[] cookie = req.getCookies();

        String id = "";

         

        if(cookie != null) {

            for(int i=0; i<cookie.length; i++) {

                if(cookie[i].getName().trim().equals("id")) {

                    System.out.println(cookie[i].getValue());

                    id = cookie[i].getValue();

                }

            }

        }

         

        req.setAttribute("id", id);

         

        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/view/ex01_cookie.jsp");

        dispatcher.forward(req, resp);

    }

}  

ex01_cookie.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Cookie</title>

</head>

<body>

    <form action="/WebTest/ex02_cookie.do" method="post">

        ID : <input type="text" name="id" value="${id}" />

        PW : <input type="password" name="pw" />

        <input type="checkbox" name="saveid" /> 아이디 저장 <br>

        <input type="submit" value="전송" />

    </form>

</body>

</html>

/cookie/Ex02_Cookie.java

package cookie;

 

import java.io.IOException;

 

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

@WebServlet("/ex02_cookie.do")

public class Ex02_Cookie extends HttpServlet {

    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

         

        req.setCharacterEncoding("utf-8");

        resp.setCharacterEncoding("utf-8");

         

         

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

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

        String ch = req.getParameter("saveid");

        System.out.println("id : " + id);

        System.out.println("pw : " + pw);

        if(id.equals("test") && pw.equals("1234")) {

             

            System.out.println("로그인 성공");

             

            if(ch != null && ch.trim().equals("on")) {

                Cookie cookie = new Cookie("id",id);

                resp.addCookie(cookie);

                System.out.println("성공");

            } else {

                Cookie cookie = new Cookie("id", null);

                cookie.setMaxAge(0);

                resp.addCookie(cookie);

                System.out.println("실패");

            }

        } else {

            System.out.println("로그인 실패");

        }

         

        resp.sendRedirect("/WebTest/ex01_cookie.do");

    }

}  

 

 

인코딩 처리

Cookie cookie = new Cookie("id",URLEncorder.encorde(id,"utf-8")

URLDecoder.decode(cookie[i].getValue(),"utf-8");

 

STEP 03 . 세션

  1. 세션은 쿠키와 다르게 사용자의 정보가 서버에 저장 됨.
  2. 사용자의 정보를 유지하기 위해서는 쿠기를 사용하는 것보다 세션을 사용한 웹 브라우저와 웹 서버의 상태 유지가 훨씬 안정적이고 보안상의 문제도 해결 가능.

<첨부 http://hyeonstorage.tistory.com/125>

 

/session/Ex01_Session.java

package session;

 

import java.io.IOException;

 

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

@WebServlet("/ex01_session.do")

public class Ex01_Session extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

         

        HttpSession session = req.getSession();

         

        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/view/ex01_session.jsp");

        dispatcher.forward(req, resp);

    }

}

ex01_session.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>로그인 페이지</title>

</head>

<body>

    <h3>로그인</h3>

     

    <form action="/WebTest/ex02_session.do" method="post">

        <table>

            <tr>

                <td>이름 : </td>

                <td><input type="text" name="name" /></td>

            </tr>

            <tr>

                <td>아이디 : </td>

                <td><input type="text" name="id" /></td>

            </tr>

            <tr>

                <td>비밀번호 : </td>

                <td><input type="password" name="pw" /></td>

            </tr>

            <tr>

                <td colspan="2">

                    <input type="submit" value="전송" />

                </td>

            </tr>

        </table>

    </form>

</body>

</html>

/session/Ex02_Session.java

package session;

 

import java.io.IOException;

import java.util.Enumeration;

 

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

@WebServlet("/ex02_session.do")

public class Ex02_Session extends HttpServlet {

    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

         

        req.setCharacterEncoding("utf-8");

         

        HttpSession session = req.getSession();

 

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

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

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

         

        session.setAttribute("name", name);

        session.setAttribute("id", id);

        session.setAttribute("pw", pw);

        session.setMaxInactiveInterval(360);

         

        Enumeration<String> Enum = session.getAttributeNames();

         

        while(Enum.hasMoreElements()) {

            System.out.println(Enum.nextElement());

        }

         

        System.out.println(session.getCreationTime());

        System.out.println(session.getMaxInactiveInterval());

         

        resp.sendRedirect("/WebTest/ex03_session.do");

    }

}

/session/Ex03_Session.java

package session;

 

import java.io.IOException;

 

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

@WebServlet("/ex03_session.do")

public class Ex03_Session extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

         

        req.setCharacterEncoding("utf-8");

         

        HttpSession session = req.getSession();

 

        if(session == null) {

            resp.sendRedirect("/WebTest/ex01_session.do");

            return;

        }

         

        String name = session.getAttribute("name").toString();

        String id = session.getAttribute("id").toString();

        String pw = session.getAttribute("pw").toString();

         

        req.setAttribute("name", name);

        req.setAttribute("id", id);

        req.setAttribute("pw", pw);

         

        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/view/ex03_session.jsp");

        dispatcher.forward(req, resp);

    }

}

ex03_session.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8" session="false"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>로그인 정보</title>

</head>

<body>

    <form action="/WebTest/ex04_session.do" method="post">

        <table>

            <tr>

                <td>이름 : </td>

                <td>${name }</td>

            </tr>

            <tr>

                <td>아이디 : </td>

                <td>${id }</td>

            </tr>

            <tr>

                <td>비밀번호 : </td>

                <td>${pw }</td>

            </tr>

            <tr>

                <td colspan="2"><input type="submit" value="로그아웃" /></td>

            </tr>

        </table>

    </form>

</body>

</html>

/session/Ex04_Session.java

package session;

 

import java.io.IOException;

 

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

@WebServlet("/ex04_session.do")

public class Ex04_Session extends HttpServlet {

    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

         

        req.setCharacterEncoding("utf-8");

         

        HttpSession session = req.getSession();

         

        session.invalidate();

         

        resp.sendRedirect("/WebTest/ex01_session.do");

    }

}