-
[Spring]🍪Cookie &🍕 SessionJava 2021. 10. 9. 21:26728x90

➰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출력✅코드분석
- jsp코드에서 id라는 키를 가지고 cookieData라는 value를 가진 Cookie를 생성
- controller부분에서 @CookieValue라는 애노테이션 사용해 키 값인 id가 value로 가지고 있는 cookieData를 idValue에 넣어주고 메소드의 파라미터값으로서 메소드 내에서 사용 가능하도록 설정
- idValue를 메소드내에서 사용하고 Cookie.jsp에 redirect로 넘겨준다
- 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>✅코드분석
- jsp코드에서 id와 age를 키값으로 가지고 tester랑 100을 value로 가진 session객체 생성
- 위에 코드를 살펴보면 session이라는 객체로 선언되어 있는 것도 있고, @ModelAttribute로 선언되어 있는 id와 age도 있다. 이 경우 session으로 선언되어 있는 newData는 session으로 선언되어 있는 sessionDelete로 사라지지만 id와 age는 SessionStatus 타입에 status를 선언해준후 status.setComplete(sessionDelete2)를 해주어야 삭제할 수 있다. 선언된 타입에 맞게 delete메소드를 설정해주야 값들을 삭제 할 수 있다.
- 결론: .invalidat는 현재 생성된 session을 무효화 시키는 것이고 SessionStatus에 setComplete은 저장된 Object를 제거하는 것이다.
'Java' 카테고리의 다른 글
[Spring] ➰URI Template (0) 2021.10.09 [Spring]MVC-with annotation🏨 (1) 2021.10.09 [Spring]💨 AOP(Aspect Oriented Programming)와 애노테이션(Annotation) (0) 2021.10.07 👫[Spring] DI(Dependency Injection)의존성 주입 및 Annotation 사용 (0) 2021.10.07