웹에서 만들어지는 특정한 데이터를 저장 및 유지하고 싶을 경우에 cookie 와 session 이라는 저장 객체를 사용 한다.
HTTP 프로토콜의 특징은 2가지가 있다
비연결지향
: 클라이언트가 서버에 요청 (Request) 를 했을 때 그 요청에 맞는 응답 ( Response ) 을 보낸 후 연결을 끊는 처리 방식이다.Stateless
: 클라이언트의 상태 정보를 가지지 않는 서버 처리 방식이다. 클라이언트와 첫번째 통신에서 데이터를 주고 받았다 해도, 두번째 통신에서 이전 데이터를 유지하지 않는다.
그래서 서버는 클라이언트가 누구인지 계속 인증을 해줘야하는 번거로운 상태에 처한다. 이러한 번거로움을 해결하여 데이터를 유지해주는 방법이 바로 cookie
와 session
이다.
사용자(client) PC
에 저장된다.브라우저를 닫거나 서비스를 종료해도 정보가 남는다.
보안이 취약
하다. 그래서 주요한 정보를 넣으면 안된다.쿠키는 브라우저간에 공유가 안된다. 그래서 브라우저를 Chrome 에서 오늘 열지 않기를 클릭한 팝업창이 Edge 에서는 또 등장하게 된다.
But ) Chrome에 한 번 저장된 쿠키는 수명이 다하기 전까지 정보는 서비스를 종료해도 남아있다.
서버
에 저장된다.서비스에서 나가거나 브라우저가 변경 될 경우 ( 사파리나 엣지같은 ) 끊어지게 된다.
server side program 으로만 제어가 가능
하다.보안이 우수
하다. 사용성도 좀 더 편리하다.key
, value
);key
와 value
에는 문자열만 들어가는 것이 가능하다.초단위
); -> 24시간은 60x60x24 로 표시response.addCookie(cookie);
: 만들어진 cookie 객체를 PC에 저장한다.request.getCookies();
Cookie[ ]
배열이다.c.getName()
c.getValue()
key
값과 value
값을 반환한다. session 은 내장객체이기 때문에 cookie 와 달리 객체를 따로 생성할 필요 없이 바로 사용이 가능하다.
seesion.setAttribute( key , value )
session.setMaxInactiveInterval(초단위)
response.sendRedirect(이동할 페이지)
<form action="loginResult.jsp" method="post">
에 의해 lognResult.jsp 로 전달 시 위의 캡처와 같이 id 와 pw 가 일치하면 세션에 값을 저장하고, 일치하지 않으면 다시 로그인 페이지로 돌아가게 활용할 수 있다.
String name = (String)session.getAttribute("name")
: seesion.getAttribute( key값 ) 으로 저장된 key의 value 값을 가져오는 것이 가능하다. value 값은 Object 타입이기 때문에 String 타입에 넣기 위해서는 형변환이 필요하다.
session.getId()
: 세션의 고유한 ID 값을 반환한다.
mypage.jsp 와 같이 로그인 한 유저만 들어올 수 있는 마이페이지를 제작할 경우 setAttribute 로 저장된 key값 loginId를 getAttribute 로 가져와 null 인 경우엔 로그인을 하지 않은 상태이므로 login.jsp 초기 화면으로 되돌리는 식으로 활용할 수 있다.
session.removeAttribute( key값 )
을 이용하여 저장된 key 값을 제거
seesion.invalidate()
를 사용하면 session에 저장된 모든 값들이 초기화되고 가장 기본값만 남게 된다. 이 때 session의 고유 ID 값은 다른 값으로 변경된다.
JSP 에서는 데이터 저장 시 공유하는 영역 들이 있다
이 영역들은 데이터를 언제 까지 가지고 있는지를 중심으로 구분 할 수 있다
page
: 페이지가 클라이언트에 제공하는 동안만 유효하다.request
: 클라이언트의 요청이 처리되는 동안만 유효하다. ( 통상 2~3 페이지정도 )session
: 세션이 유지되는 동안만 유효하다.application
: 어플리케이션이 실행되는 동안 유효하다.scriptlet 은 유용하긴 하지만 페이지가 복잡해 보인다.
개발자 들은 scriptlet 줄이기 위해 노력을 하는데 이 중 하나가 Action Tag
이다.
forward
: 특정 페이지로 이동시켜주는 역할을 한다 ( redirect 와 유사 )include
: 특정 페이지를 불러옴useBean
: 빈을 사용forward
는 특정 페이지로 이동시켜주는 역할로 response.sendRedirect(이동할 페이지)
와 유사하다. 다만 redirect
와 몇가지 차이가 있다.
redirect
는 response.sendRedirect() 와 같이 response 객체
를 사용하기 때문에 데이터 전송이 불가능하다.
반면 forward
는 request 객체
를 사용하기 때문에 데이터 전송이 가능하다.
redirect
는 사용 시 이동한 마지막 ( 최종 ) 페이지를 주소창에 표시를 한다. : 보안 낮음
반면 forward
는 사용해도 이동한 페이지를 표시하지 않는다. : 보안 높음
( 모르는 사람이 우리 집 문 앞 까지 아는 것과, 집으로 가는 버스정류장까지 아는 것의 차이 )
forward
는 데이터 전달이 가능하다. 또 추가 Parameter 도 보내는게 가능하다.
<jsp:forward page="result.jsp"> <jsp:param name="tel" value="010-1234-1234"/> </jsp:forward>```
include
는 scriptlet 의 <%@ page include%>
를 대체 하기 위해 나왔다
forward 와 같이 request 객체
를 사용하기 때문에 데이터 전송 및 추가 Parameter
보내는 것이 가능하다.
<jsp:include page="footer.jsp"> <jsp:param name="content" value="my content"/> </jsp:include>```
톰캣에서 각각 인코딩 하는 방식이 다르기 때문에 생기는 문제이다.
request.setCharacterEncoding("UTF-8");```
를 사용해주면 post 방식으로 전달되는 데이터들의 한글 깨짐을 막을 수 있다.
java Build Path 에서 jdk 11 버전으로 맞춰도 project Facets 에서는 17 버전으로 떠서
로 표시가 된다. Project Facet 도 11 버전으로 바꿔줘야 한다,.