ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Servlet-JSP MVC02(4) - Application,Session,Cookie
    Web/Servlet-JSP 2023. 6. 12. 18:16

     

    - 서블릿 컨테이너의 임시저장소

     

    서블릿사이에 자원을 공유하기 위한 임시저장소들에 대해 앞서 간단하게 알아보았는데, 

    조금 더 자세하게 이들에 대해 알아보도록 하자

     

    1. Application

     

    > Servlet Context라고도 불리는 Application은 WAS의 하나의 웹프로젝트 내에 서블릿 컨테이너에 

    계속 존재하면서 값을 저장해둔다.

    > Context라는 말은 Context Path에서 처럼 하나의 웹프로젝트에서의 문맥으로 ContextPath는 WAS내에 웹프로젝트들과 그에 따른 요청을 구별하게 해주는 하나의 문맥, 줄기의 설정이었다면, (ex /MVC01/list.do와 /MVC02/list.do를 구별하게 해주는 역할) Servlet Context는 계속 이어갈 수 있는 상태에 대한 설정을 위한 장소이다.

     

    사용범위 - 전역

    생명주기 - WAS의 시작에서 종료까지

    저장위치 - WAS 서버의 메모리 

     

    사용법 - 컨트롤러에 request객체를 통해 application객체를 얻을 수 있고, 이를 통해 값을 저장할 수 있다.

    //어플리케이션 생성하기 
    ServletContext application = request.getServletContext(); // application얻기
    //맵형태로 데이터 저장
    application.setAttribute("value", v);
    application.setAttribute("bu", bu);
    
    //어플리케이션에 저장된 값 읽어오기 
    int x = (Integer)application.getAttribute("value");

    2. Session

     

    Session은 클라이언트 별 임시저장공간이다.

    Application은 서버단위로 데이터들 저장하고, request는 클라이언트 요청단위로 데이터를 저장하고,

    Session은 클라이언트(웹브라우저별)단위로 데이터를 저장한다.

    Session은 사용자를 다음과 같이 구별한다.

    출처: 뉴렉처 servlet/jsp강의 28

    사용자를 구별하기 위해서 브라우저별로 세션아이디를 부여한다.

        >첫 요청에는 세션아이디가 없다. 따라서 세션객체를 사용할 수 없다 (어플리케이션은 사용가능)

        >첫 요청에 대한 응답에 따라 세션아이디가 자동으로 부여되고, 다음 요청부터 세션을 사용할 수 있게 된다.

          (쿠키를 통해 세션아이디가 전달된다)

        >브라우저를 닫거나, 세션이 만료되면, 기존의 세션아이디는 사라지고 새로운 아이디와 저장소를 부여받게 된다.

     

    *동일 브라우저를 여러개 띄우는 것은 같은 클라이언트로 인식한다 (하나의 프로세스에 여러 쓰레드) 

     

    사용범위 - 세션(특정사용자)

    생명주기 - 세션이 시작해서 종료될 때

    저장위치 - WAS 서버의 메모리 

    //세션 생성하기 
    HttpSession session = request.getSession(); // session얻기
    //맵형태로 데이터 저장
    session.setAttribute("value", v);
    session.setAttribute("bu", bu);
    
    //세션에 저장된 값 읽어오기 
    String op =(String)session.getAttribute("bu");

    출처: 뉴렉처 servlet/jsp강의

    세션은 값을 저장하고 꺼내는 것 외에도 위와 같은 옵션들이 있다. 

    위와 같은 옵션들로 세션에 저장된 데이터를 바로 해제하거나 세션의 생명주기를 관리할 수 있다.

     

    3. Cookie

     

    지금까지는 WAS내에 상태값을 저장했다. 

    Cookie는 반대로 상태값을 클라이언트가 가지고 다니는 것이다. 

     

    출처: 뉴렉처 Servlet-jsp 강의
    출처: 뉴렉처 Servlet-jsp 강의

    하나의 request에는 클라이언트 헤더정보, 사용자 데이터, 쿠키 총 3가지의 정보가 서버로 흘러들어온다.

    헤더정보는 브라우저내에서 자동으로 설정된 것이고, 사용자는 데이터는 사용자가 설정해서 보낸 것이다.

    나머지 하나인 쿠키는 Cookie는 서버가 미리 설정해서 때에 따라 꺼내서 쓸 수 있도록 브라우저에 저장해둔 값이다.

     

    사용범위 - Web Browser 혹은 지정한 path 범주 공간 (특정 url에 한정 사용도 가능하다)

    생명주기 - browser에 전달한 시간부터 만료시간까지

    저장위치 - web Browser 메모리 혹은 파일

    **서버 생명주기와 상관없이 저장 가능하다.

     

    //쿠키 생성 및 response객체를 통해 쿠키 심기 
    Cookie cookie  = new Cookie("c",String.valueOf(result));
    response.addCookie(cookie);
    
    //쿠키 읽기 
    Cookie[] cookies = request.getCookies();
    String _c="";
    
    if(cookies != null)
    for(Cookie cookie: cookies)
    	if("c".equals(cookie.getName())
        	_c=cookie.getValue();

    *쿠키의 출발점은 addCookie()로 일단 쿠키를 클라이언트 브라우저에 저장하는 것 부터 시작이다

    *쿠키도 map형태로 값을 저장하는데, 문자열만 저장할 수 있다.! 

     

    4.1 Cookie의 path옵션

     

     - 하나의 브라우저에 모든 페이지에 동일하게 쿠키를 저장하고 전달받으면, 쿠키를 찾아서 쓸 때 많은 불편함을 초래할 것이다.

        > 특정 요청에서만 사용되는 데이터를 쿠키로 저장했을 때, 이를 사용하지 않는 요청은 이 쿠키를 읽을 필요없다.

        > 브라우저별로만 쿠키가 운용된다면, 쿠키명이 중복되는 문제도 발생할 것이다.

     

    이러한 불편함을 해소하기 위해 브라우저에 쿠키를 심되,

    해당 쿠키를 필요로하는 요청 혹은 범주에서만 쿠키를 request에 담아서 가져오도록 

    path옵션을 설정할 수 있다. 

    Cookie valcookie = new Cookie("value",String.valueOf(v));
    Cookie opcookie = new Cookie("bu",bu);
    		valcookie.setPath("/");
    		opcookie.setPath("/"); // 이부분 
    		response.addCookie(valcookie);
    		response.addCookie(opcookie);

    setPath는 쿠키를 보내기전에 간단하게 설정할 수 있다. 위는 모든 요청에 대해 쿠키를 가져오도록 설정해서 심어둔 것이

    각각 /add.do 에 대한 request와 response헤더

    path를 /로 지정하면, 어떠한 요청에도 request에 쿠키를 담아오라는 뜻이 된다.

     

    setPath를 변경하면, ex(/add) 

    동일 요청에 response헤더에는 쿠키가 path = /add로 심어지는 것을 확인할 수 있지만,

    request시에는 쿠키가 같이 넘어가지 않아서 request헤더에 해당 쿠키를 찾아 볼 수 없다.

    이때 /add로 요청하면

    에러가 뜨지만, request헤더에 쿠키가 담겨져서 서버로 넘어간 것을 확인할 수 있다.

     

    4.2 Cookie의 maxAge옵션

     

    브라우저가 닫히면 쿠키는 어떻게 될까?

    일반적으로는 Cookie의 생명주기는 브라우저와 같아서 브라우저 메모리내에 있다가 

    브라우저가 닫히면 사라지게된다.

    하지만 maxAge옵션을 통해 브라우저와 상관없이 쿠키를 유지할 수 있다.

     

    valcookie.setMaxAge(24*60*60); //하루 60초 60분 24시간)

    다음과 같이 간단하게 maxAge를 설정할 수 있다.

    이렇게 maxAge가 설정된 쿠키는 인터넷 브라우저 기준으로 아래와 같은 기본경로에 저장된다.

    출처: 뉴렉처 Servlet-jsp 강의

       쿠키는 다른 저장공간과는 다르게 위와 같은 두가지 옵션에 이점이 있다.

       따라서 특정 범위, 페이지에만 쓰는 데이터라던지, 저장기간이 아주 긴 데이터에 경우에는 

       쿠키를 사용하는 것이 좋다.

     

       *쿠키와 비슷한 세션은 긴 시간 유지하기 어렵고, 브라우저 닫히면 쿠키를 통해 전달되는 session id가 초기화되서 오랜기간 유지되더라도 다시 접근할 수 없다.

     

     

     

    참고자료:

    뉴렉처 - jsp/Servlet강의 (유튜브)

    https://www.youtube.com/@newlec1

     

    뉴렉처

    "유료" 온라인 강의 사이트 뉴렉처에서 제공하는 프로그래밍 강의 채널입니다. 교육서비스 : (10월 새롭게 오픈될 예정입니다.) https://www.newlecture.com 교재: https://javaweb.tistory.com https://answeris.tistory.

    www.youtube.com

     

Designed by Tistory.