ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring]🍪Cookie &🍕 Session
    Java 2021. 10. 9. 21:26
    728x90

    ➰Cookie&Session

    1. Cookie와 Session이란 무엇일까?

    • 🍪Cookie란?!

      • ✅ Client의 정보를 Client 시스템에 저장하는 형식이다

      • ✅저장 데이터 타입은 문자열만 가능이다.

      • ✅보안을 고려한 중요한 데이터는 쿠키 활용 비추

      • ✅생성 및 활용

        • 💢 [생성]

           Cookie 변수 = new Cookie("key", "value");
           변수.setMaxAge(초단위로 설정); client 시스템에 잔존시간 설정
           response.addCookie(변수); client 시스템이 전송해서 생성
        • 💢 [활용]

          Cookie [] 변수 = request.getCookies();
                  변수.getName() - key 반환
                  변수.getValue() - value 반환

    일반적으로 쿠키는 이런식으로 생성하고 생성한 데이터를 활용할때 Cookie에 있는 모든값들은 반복문으로 돌리고 가정문을 사용해서 활용해야 했지만 SpringBoot에서는 @CookieValue라는 애노테이션을 이용하여 원활하게 이용할 수 있다. 이부분은 마지막에 코드를 통해 몸소 느껴보자

    • 🍕 Session이란?

      • ✅ Server 시스템에 저장(쿠키보다 보안을 고려&안정적)

      • ✅ 데이터 타입은 개체 타입이면 다 가능

      • ✅ client 수가 많을수록 서버 부하를 야기 - 다른 상태유지 기술과 적절히 혼용

      • ✅ 원리

        • ✔ web container가 client를 구분, HttpServelet 객체도 개별적으로 생성

        • ✔ HttpSession 객체를 해당 user에 매핑된 객체가 없을 경우엔 생성, 이미 존재할 경우 servlet간에 재사용 즉 공유

        • ✔ 다수의 client 구분을 어떻게 할까?
          접속을 한 user별로 무조건 JESSIONID 생성하여 모든 user가 중복이 안되는 랜덤값으로 value를 생성한다

        • ex)* JESSIONID 2EADC58F3DB1A6C1A7B8D56296DF6473

        • ✔ 결론: web container - JESSIONID 값 비교로 user들을 구분

        • ✔ 생성 및 활용

          • 💢 [생성 및 데이터 저장]

             HttpSession session = request.getSession();
             session.setAttribhute("key", "value")
          • 💢 [세션 데이터 활용]

             HttpSession session = request.getSession();
             Object session.getAttribute("key");
             세션의 자원 보호를 위해서 logtout시에 반드시 자원 해제
             session.invalidate = 필수 사항     

    ➰ 2. 코드를 통한 Cookie와 Session을 이해해보자!

    • 🍪 쿠키(Cookie)

      • ✅controller 코드

          @Controller //현 클래스는 http 요청/응답 처리 기능의 controller.입니다.
          @RequestMapping("sessiontracking")  //이 클래스 내부의 모든 메소드의 공통된url일부 선언
          public class Controller {
        
          //  Cookie c = new Cookie("id", "cookieData");
              @RequestMapping("/cookietest")
              public String m1(@CookieValue("id") String idValue) {  //"id" = "id", idValue = "cookieData"
                  System.out.println("m1() ---" + idValue);
                  return "redirect:/step03Cookie.jsp";
              }
          }   
      • ✅jsp코드

          <%
              //test용 Cookie 데이터 생성해서 client에게 전송
              Cookie c = new Cookie("id", "cookieData");
              c.setMaxAge(60*60);
              response.addCookie(c);
        
          %>
        
          <body>
              <h2>Spring 기반의 상태 유지 기술</h2>
              <br><hr><br>
        
              * test를 위한 쿠키와 세션 데이터는 해당 jsp에서 저장했음 <br>    
              <br><hr><br>
              <h3>[1] Cookie API 활용</h3>
              <a href="sessiontracking/cookietest">1.sessiontracking/cookietest & @CookieValue</a>
          </body>
      • ✅Cookie.jsp코드

          ${cookie.id.value}  //cookieData출력
      • ✅코드분석

          1. jsp코드에서 id라는 키를 가지고 cookieData라는 value를 가진 Cookie를 생성
          1. controller부분에서 @CookieValue라는 애노테이션 사용해 키 값인 id가 value로 가지고 있는 cookieData를 idValue에 넣어주고 메소드의 파라미터값으로서 메소드 내에서 사용 가능하도록 설정
          1. idValue를 메소드내에서 사용하고 Cookie.jsp에 redirect로 넘겨준다
          1. Cookies.jsp에서 ${cookie.id.value} 이엘테그를 이용해 cookieData라는 value값을 뽑아낼수 있다.(value생략시 원하는 결과값이 아닌 주소값이 출력)
    • 🍕세션(Session)

      • ✅controller 코드

          @Controller //현 클래스는 http 요청/응답 처리 기능의 controller.입니다.
          @RequestMapping("sessiontracking")  //이 클래스 내부의 모든 메소드의 공통된url일부 선언
          public class Controller {
        
              @RequestMapping("/sessionTest1")
              public String m2(HttpSession session) {
        
                  System.out.println("sessionTest1 ---" + session.getAttribute("id"));
        
                  session.setAttribute("newData", "서버에서 새로 저장한 데이터");
                  return "redirect:/step03Session.jsp";
              }
        
          //    HttpSession 객체 삭제 메소드
              @RequestMapping("/sessionDelete")
              public String m3(HttpSession session) {
        
              System.out.println("sessionDelete1()");
              session.invalidate();
              session = null;
        
              return "redirect:/step03Session.jsp";
          }
        
              @RequestMapping("/sessionTest2")
              public String m4(@ModelAttribute("id") String id,
                              @ModelAttribute("age") int age) {
        
                  System.out.println("sessionTest2" + id + "--" + age);
                  return "redirect:/step03Session.jsp";
              }
        
              @RequestMapping("/sessionDelete2")
              public String m5(SessionStatus status) {
        
                  System.out.println("sessionDelete2 status");
        
                  status.setComplete();
                  return "redirect:/step03Session.jsp";
              }
        
              @RequestMapping("/sessionTest3DTO")
              public String m6(Model model, Customer cust) {
                  model.addAttribute("cust", cust);
                  System.out.println("m6()--");
                  return "redirect:/step03Session.jsp";
              }
          }   
      • ✅jsp코드

          <%
             //test용 Session 데이터 저장
              session.setAttribute("id", "tester");
              session.setAttribute("age", 100);
        
          %>
          <body>
        
          <br><hr><br>
          <h3>[2] HttpSession API 활용</h3>
          <a href="sessiontracking/sessionTest1">2-1. HttpSession API 활용 </a>
        
          <br><br>
          <a href="sessiontracking/sessionTest2">2-2. @SessionAttributes 이해하기 </a>
        
          <br><br>
        
          <a href="sessiontracking/sessionTest3DTO?id=khk&age=20">2-3. DTO 객체를 세션에 저장(name, age 데이터 전송)</a>
          </body>
      • ✅Cookie.jsp코드

          <body>
          step03Session3.jsp :<br>
          sessionTest1-${sessionScope.newData}-Httpsession으로 삭제
          sessionTest2-${sessionScope.id}-Httpsession으로 삭제불가 - sessionStatus해서 삭제가능
          sessionTest3-${sessionScope.age }  Httpsession으로 삭제불가 - sessionStatus해서 삭제가능
        
          <br><hr><br>
          <a href="sessiontracking/sessionDelete">1.HttpSession API로 삭제</a>
          <br><br>
          <a href="sessiontracking/sessionDelete2">2.Spring API로 삭제</a>
        
          <br><hr><br>
          세션에 cust라는 key로 저장된 Customer 데이터 : ${sessionScope.cust.id}-${sessionScope.cust.age}
        
          </body>
      • ✅코드분석

          1. jsp코드에서 id와 age를 키값으로 가지고 tester랑 100을 value로 가진 session객체 생성
          1. 위에 코드를 살펴보면 session이라는 객체로 선언되어 있는 것도 있고, @ModelAttribute로 선언되어 있는 id와 age도 있다. 이 경우 session으로 선언되어 있는 newData는 session으로 선언되어 있는 sessionDelete로 사라지지만 id와 age는 SessionStatus 타입에 status를 선언해준후 status.setComplete(sessionDelete2)를 해주어야 삭제할 수 있다. 선언된 타입에 맞게 delete메소드를 설정해주야 값들을 삭제 할 수 있다.
          1. 결론: .invalidat는 현재 생성된 session을 무효화 시키는 것이고 SessionStatus에 setComplete은 저장된 Object를 제거하는 것이다.

    댓글

Designed by Tistory.