JSP

#2 JSP Project 03(CURD게시판) - 기본개념03(쿠키/세션)

H-V 2021. 8. 15. 16:08

유투버 'ITTHISGO. IT 이거라도 알고 가자!' 님의 강의 참조

 

 

 

1) 쿠키

  • 쿠키는 서버에서 생성하고 브라우저에 응답하여 저장하도록 하는 데이터이며 브라우저는 저장된 쿠키를 해당사이트에 어떠한 자원을 요청시에 항상 포함하여 전송
  • 브라우저가 어떠한 사이트를 이용하면서 짧게 유지할 값이 있다면 '쿠키'를 사용
<body>
<%
Cookie cookie1 = new Cookie("name", "HGD");
Cookie cookie2 = new Cookie("age", "20");
System.out.println("name:"+cookie1.getValue());
System.out.println("age:"+cookie2.getValue());
%>
쿠키가 생성 되었습니다. 
</body>

쿠키에서 가지고있는 JESSIONID를 통해 이 브라우저가 어떠한 상태인지를 서버는 식별함 현재 요청을 통해서 쿠키가 요청의 헤더에 들어있는 상태. RESPONSE에는 없다

response.addCookie(cookie1);
response.addCookie(cookie1);
  • addCookie를 통해 응답시에 쿠키를 추가 할 수 있고 추가를 통해 브라우저에 저장이 가능하다 

  • 즉 저장된 후 새로고침 혹은 웹브라우저가 이 서버에 재접속을하면 쿠키로 저장된 값이 계속 남게되고 식별 된다. 

 

예제1

  • 서버에서 쿠키를 생성(new cookie)하고 response.addCookie 를 통해서 브라우저에 저장시키는것을 기억하자
  • 순서를 잘 기억해야한다
    1. 브라우저에서 서버로 자원을 요청 (index.jsp)
    2. 서버에서 쿠키 생성 및 응답에 포함 (index.jsp의 Cookie 객체들)
    3. 브라우저는 응답받은 쿠키를 저장소에 저장 (검사페이지에서 확인가능)
    4. 응답시에 해당사이트로 쿠키를 함께 전송
    5. 요청에서 쿠키정보 확인 가능 
<body>
<h2>쿠키 목록</h2>
<%
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies){
%>
	<%= cookie.getName()%> : <%= cookie.getValue()%><br>

<% } %>
</body>

REQUEST 헤더에 쿠키를 가지고 있기때문에 가능한 상황!

  • 따로 쿠키 유지시간을 지정하지 않았기 때문에 종료를하지않으면 쿠키는 계속 살아있다(세션이 사라질때까지 쿠키시간은 유효)

예제2 - 쿠키 수정

<body>
<%
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0){
	for (int i=0; i<cookies.length; i++){
		if(cookies[i].getName().equals("name")){
			//여기서 아예 다시 setCookie를 시키는 것 (new Cookie = 새 객체)
			Cookie cookie = new Cookie("name","KKA");
			response.addCookie(cookie);
		}
	}
}
%>
</body>

쿠키값이 바뀌어서 저장되는걸 볼 수 있다

 

예제3 - 쿠키 삭제

<body>
<%
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0){
	for (int i=0; i<cookies.length; i++){
		if(cookies[i].getName().equals("name")){
			//여기서 아예 다시 setCookie를 시키는 것 (new Cookie = 새 객체)
			Cookie cookie = new Cookie("name","");
			cookie.setMaxAge(0);
			response.addCookie(cookie);
		}
	}
}
%>
</body>

  • 쿠키 유효 시간을 정해 쿠키를 날릴 수 있다
  • 자주 쓰이는 쿠키 함수
  1. setPath() - URL위치를 조절하여 쿠키 생성
  2. setMaxAge() - 쿠키 유효시간 설정(쿠키는 유효시간이 지나면 다시 사용되지 못함) - 브라우저 닫혀도 유지

 

예제 3 - 쿠키를 이용하여 아이디 기억하기

*loginForm.jsp
<form action ="loginProc.jsp">
	<input type="text" name="id" placeholder="ID"><br>
	<input type="password" name="pw" placeholder="PASSWORD"><br>
	Remember your ID<input type="checkbox" name="remember" value="chk"><br>
	<input type="submit" value="Login">
</form>

쿠키로 받을 데이터를 넘긴다

<%
//1. 요청 파라미터 들고오기
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String rmb = request.getParameter("remember");
System.out.println("id:"+id);
System.out.println("pw:"+pw);
System.out.println("remember:"+rmb);
  • 리멤버 여부에따라 값을 읽어볼수있다!

항상 콘솔에 찍어보자

<body>
<%
//1. 요청 파라미터 들고오기
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String rmb = request.getParameter("remember");
System.out.println("id:"+id);
System.out.println("pw:"+pw);
System.out.println("remember:"+rmb);


//2. 들고온 파라미터 유효검사 -> 아이디 기억여부에 따라 쿠키 생성하여 응답, 쿠키 1시간 유지
if (id.equals(pw)){
	System.out.println("Login Success");
	if(rmb != null){
		Cookie rmbId = new Cookie("rbm", id);//리멤버 쿠키가 존재하면 체크박스 채우기 
		rmbId.setMaxAge(60 * 60);
		response.addCookie(rmbId); //쿠키와 같이 응답
		System.out.println("ID/COOKIE SAVED");
	} else {
		Cookie rmbId = new Cookie("rbm", id);//리멤버 쿠키가 존재하면 체크박스 채우기 
		rmbId.setMaxAge(0);
		response.addCookie(rmbId); //쿠키와 같이 응답
		System.out.println("ID/COOKIE UNSAVED");
	}
	response.sendRedirect("login.jsp");
}
//3. 같지않으면 다시 로그인 페이지 
else {
	System.out.println("Login Failed");
	response.sendRedirect("index.jsp");
}
%>
</body>
  • 리멤버 체크박스 기억하기는 서버에서 진행되어야 하므로 index.jsp 에 코드 구성
  • checked 속성을 사용할 줄 알아야한다!!
<body>
<%
String checked = "";
String id = "";
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
	for (int i=0; i<cookies.length; i++){
		if(cookies[i].getName().equals("rbm")){
			checked = "checked";
			id = cookies[i].getValue();
		}
	}
}
%>
<form action ="loginProc.jsp" method="post">
	<input type="text" name="id" placeholder="ID" value="<%= id %>"><br>
	<input type="password" name="pw" placeholder="PASSWORD"><br>
	Remember your ID<input type="checkbox" name="remember" value="chk" <%= checked %>><br>
	<input type="submit" value="Login">
</form>
  • 저장되어있는 쿠키들을 포문을 통해서 글고오고 쿠키들중 이름이 " "이하와 같으면 checked를 "checked"로 바꾸고 쿠키의 밸류값을 id에 줘서 input에 적용하면 된다

쿠키도 남고 아이디도 기억을 한다!

 

 

 

 

2) 세션

  • JSP로 최초 작업시 세션은 자동으로 만들어진다. 세션은 브라우저를 기억한다. 새로운 브라우저가 서버에 접근시에 자동으로 세션이 부여가되고 서버는 그것을 통해서 어느 브라우저가 어떻게 들어왔는지 식별한다

처음 브라우저가 접근을 하면 서버에서는 setCookie를 통해 SESSION을 부여한다

  • 세션도 쿠키와 마찬가지로 삭제/시간 지정이 가능하다
    session.invalidate() - 세션값을 날리는 함수로 주로 로그아웃에 많이 쓴다
    session.setMaxInactiveInterval() - 유효 시간 설정함수로 주로 은행어플등에 많이 쓴다(web.xml에서도 설정 가능)

  • 세션이 내장객체로 존재하는이유는 브라우저를 식별만하는것이아닌 브라우저와 관계된 데이터를 서버에 저장하기위해 사용
<body>
<form action="sessionSave.jsp">
<input type="text" name="data">
<input type="submit" value="Send">
</form>
</body>


*sessionSave.jsp
<%
String data = request.getParameter("data");
session.setAttribute("save", data); // 세션에 저장
response.sendRedirect("sessionInfo.jsp");
%>


*sessionInfo.jsp
<body>
세션 요청자 : <%= session.getId() %><br>
세션 응답 데이터: <%= session.getAttribute("save") %>
</body>

 

  • 클라이언트가 데이터요청시에 세션으로 식별후 request.getParameter로 요청한 데이터를 받아서 처리후에 다시 세션에 데이터를 넣어서(session.setAttribute) 응답한다
  • 그 데이터를 받기위해서는 session.getAttribute("")

  • 데이터를 이렇게 서버쪽에 저장해놓고 쓸 수 있다. 주로 로그인 성공에 쓴다 

 

예제 - 세션으로 로그인 개념 잡기

  1. 로그인 요청 -> 성공시 세션에 ID부여 -> 리다이렉트로 로그인성공페이지로 이동
  2. 로그인 되어 있는 상태에서 다시 로그인이나 로그인 처리 페이지로하면 로그인성공페이지로 이동
  3. 로그아웃버튼을 누르면 세션 잃고 다시 로그인하라고 만들기
*loginProc.jsp
....
if (id.equals(pw)){
	System.out.println("Login Success");
	session.setAttribute("loginId", id);
....


*index.jsp
<body>
<%
String loginId = (String)session.getAttribute("loginId");
if(loginId != null){
	System.out.println("로그인이 이미 되어 있습니다.");
	response.sendRedirect("loginSuccess.jsp");

  • loginProc에서 로그인 성공하면 데이터를 세션에 부여(session.setAttribute)하여 sendRedirect페이지로 이동하게되고 다시 로그인 페이지로 가려고하면 index.jsp에서 부여된 데이터를 확인(session.getAttribute)하고 유효검사 유무에따라 페이지가 갈리게 된다. 즉 세션 데이터가 로그인시에 입력한 데이터와 같으면 '로그인이 이미 되어 있습니다'라고 알려주게 되는 개념

 

  • 로그아웃과 동시에 세션 날리기
<a href="logout.jsp"><button>로그아웃</button></a>
*logout.jsp
<%
System.out.println(session.getAttribute("loginId") + "이 로그아웃 했습니다");
session.invalidate();
response.sendRedirect("index.jsp");
%>

 

  • 세션이 invalidated 되면서 로그인을 다시 하게 만든다