JSP

Cookie 와 Session

mukom 2022. 8. 13. 21:14

1. Cookie(쿠키)

  JSP에서 생성하는 쿠키는 웹 서버에서 생성되어 웹 브라우저에 보관하는 데이터이다. 

  저장된 쿠키는 웹 브라우저에서 웹 서버로 요청할 때마다 함께 보내진다.

 

  1-1. 쿠키 구성 요소

         - 이름 : 웹 브라우저는 여러 개의 쿠키를 가지고 있을 수 있기 때문에, 쿠키마다 변별력을 주기 위하여 이름을 사용한다.

         - 값 : 웹 브라우저와 웹 서버가 원하는 작업을 수행하기 위하여 사용될 데이터이다.

        - 유효시간 : 쿠키가 정상적으로 기능할 수 있는 시간을 setMaxAge()(초 단위) 메서드를 통해 제한한다. 

                          🖍 유효시간을 별도로 지정하지 않으면 웹 브라우저가 종료되면서 쿠키가 삭제 처리된다.

        - 도메인 : 같은 쿠키를 함께 공유할 도메인의 범위를 setDomain() 메서드를 통해 지정한다.

                        메서드로 범위를 지정하더라도 보안 상의 문제로 쿠키는 다른 도메인으로의 전송은 되지 않는다.

                        🖍 기본적으로는 쿠키가 생성된 서버에만 전송한다.

        - 경로 : 쿠키를 함께 공유할 기준이 될 경로(URL의 도메인 이후 부분)를  setPath()로 지정할 수 있다. 

                    여러 JSP에서 사용할 수 있도록 "/"으로 설정하는 경우가 많다. 

                    🖍  경로를 별도로 지정하지 않으면 실행한 URL을 기준한다.

 

  1-2. 쿠키 활용

 

          1-2-1. Cookie class

 

                     1) 쿠키 생성

<%
	Cookie cookie = new Cookie("cookieName", "cookieValue");
    response.addCookie(cookie);
%>

                          Cookie 클래스를 통해 생성된 객체를 response 기본 객체에 넣어 웹 브라우저에 보낸다.

 

                     2) 값 읽기

<%
	Cookie[] cookies = request.getCookies();
%>

                           웹 브라우저의 request 기본 객체의 헤더에 저장된 쿠키를 꺼내어 확인할 수 있다.

                           웹 브라우저는 여러 개의 쿠키를 가지고 있을 수 있기 때문에 배열 타입으로 받는다.

                           헤더에 저장된 쿠키가 없는 경우에는 null을 return한다. 

                           🖍 null 이 return 될 수 있기 때문에 null check를 하지 않으면 NullPointerException이 발생할 수 있다.

 

                     3) 값 변경

<%
	Cookie cookie = new Cookie("name", URIEncoder.encode("변경할 값", "utf-8"));
    response.addCookie(cookie);
%>

                           쿠키는 값을 변경하기 위하여 같은 이름의 쿠키의 객체를 새로 생성하는 방법을 사용한다.

                           이러한 방법은 기존에 같은 이름의 쿠키가 존재하지 않으면 변경이 아닌 생성만 되기 때문에,

                           변경 전 변경하고자 하는 이름의 쿠키가 있는지 먼저 확인하는 코드가 필요하다.

 

                     4) 삭제

<%
	Cookie cookie = new Cookie(name, value);
    cookie.setMaxAge(0);
    response.addCookie(cookie);
%>

                           쿠키를 삭제하기 위한 별도의 메서드가 제공되지 않기 때문에 유효시간(0)을 이용한다.

                         

          1-2-2. Cookies class 

 

                     1) 생성

<%
	Cookie cookie = Cookies.createCookie("name", "value");
    Cookie cookie = Cookies.createCookie("name", "value", "path", "maxAge");
    Cookie cookie = Cookies.createCookie("name", "value", "domain", "path", "maxAge");
%>

                           createCookie() 메서드는 위와 같이 세 가지 패턴으로 제공된다. 

                           Cookie 클래스에서 하나하나 지정해야 했던 부분을 간략하게 설정할 수 있다는 장점이 있다.

 

                     2) 값 읽기 

<%
	// request 기본 객체로부터 쿠키 정보를 읽어 온다.
    Cookies cookies = new Cookies(request);
    
    // 특정 쿠키가 존재하는지 확인
    if(cookies.exists("name")) {
        	
		// getCookie() 메서드 사용 : Cookie 클래스로 사용 가능
		Cookie cookie = cookies.getCookie("name");
            
		// getValue() 매서드 사용 : "name"에 해당하는 쿠키의 값을 반환
		String value = cookies.getValue("name");
	}
%>

 

2. Session(세션)

    session은 웹 컨테이너에 정보를 보관할 때 사용하며, 서버에서만 생성할 수 있다. 

    한 웹 브라우저마다 한 개의 session을 할당 받을 수 있다. 

 

    2-1. session 생성 및 활용

            JSP 의 page 디렉티브는 기본적으로 session 속성을 true 로 설정하고 있다. 

            🖍 설정을 false 로 변경하게 되면 session 을 만들지 않겠다고 하는 것이다.

            session은 웹 브라우저의 최초 요청에 의하여 만들어지며, 이후의 요청은 이미 생성된 session이 사용된다.

            session은 session 기본 객체를 통해 사용할 수 있다.

            session.setAttribute("name", "value") 메서드로 값을 저장할 수 있고,

            session.getAttribute("name") 메서드를 통해 값을 읽어 올 수 있다.

 

            ✍️ request.getSession() 으로 session 생성

            request 기본 객체의 getSession() 메서드는 session 이 존재하면 해당 session 을 return,

            존재하지 않으면 새로운 session 을 생성한다.

            🖍 존재하지 않을 때 새로운 session 생성을 원하지 않을 경우

            getSession(false)로 작성하여 null 을 return 받을 수 있다.

 

  2-2. session 유효 시간 및 종료

           session 은 마지막 접근 이후 일정한 시간 동안 접근하지 않으면 자동으로 세션을 종료하는 기능을 가졌다.

           session 에 대하여 종료하기까지 걸리는 유효 시간을 조절하는 방법은 아래와 같이 두 가지 방법이 있다.

           - <session-config> 태그 설정(분 단위)

           - setMaxInactiveInterval() 메서드 설정(초 단위)

           🖍 태그 설정에서 값을 0 또는 음수로 설정하면 실질적으로 session 을 종료하지 않는 한 객체가 서버에 계속 유지하게 되는데,

           이러한 경우 사용되지 않는 경우에도 메모리에 계속 남게 되어 이후 메모리 부족 현상을 겪을 수 있다.

           session 은 invalidate() 메서드를 통해서 명시적으로 종료시킬 수 있다. 

           🖍 기존의 session 을 종료하더라도 새로운 요청이 있을 경우에는 새로운 session 객체가 만들어진다.

 

3. Cookie 와 Session 비교

   cookie 는 웹 브라우저에 session 은 웹 서버에 저장된다는 점에서 가장 큰 차이점을 가지고 있다.

   이러한 차이점으로 인하여 cookie 는 session 에 비하여 보안에 있어서 취약점을 가지게 되었다. 

   🖍 하지만 데이터를 웹 브라우저에 가지고 있게 되면서 웹 서버의 부담을 줄일 수 있다.

    

   ✍️ JSESSIONID Cookie

   session 은 웹 서버에만 데이터를 저장하여 보안에 있어 이점을 얻었다.

   하지만 어떤 웹 브라우저가 어떤 session 과 연결되어 있는지 판단할 수 없다.

   이를 위해서는 웹 서버는 웹 브라우저에 session 의 고유한 ID 값을 전송하고, 

   웹 브라우저는 웹 서버에 요청할 때마다 저장된 값을 보내서

   자신이 어떤 session 과 연결되어야 하는지 알려주는 방법이 필요하다.

   이 경우에 웹 브라우저에 값을 저장하고 그 값을 웹 서버에도 보내기 위해 JSESSIONID Cookie 를 사용할 수 있다.