프로그래밍/Servlet&JPS

06 Servlet : Session과 Cookie

pupu91 2022. 8. 23. 21:54
반응형

 

HTTP통신

서버는 client의 요청에 응답을 하고 나면 그 연결을 끊어버림
client는 다시 서버에 요청하려면 새로 연결해야 함
연결이 끊어지기 때문에 유지되어야 하는 정보들이 사라지는 문제 발생(ex 로그인 후의 정보, 장바구니에 넣은 데이터 등)

 

 

Session과 Cookie

연결이 끊어진 이후에도 client에 대한 정보를 유지하기 위한 두가지 방법을 사용

1. Cookie
: client 측에서 데이터를 보관하는 방법
필요시에 해당하는 정보를 서버와 공유하여 정보를 유지
Map형식으로 저장되고, 데이터의 크기, 개수 제한 있음
쿠키유지시간, 유효디렉터리, 유효도메인 등을 설정

2. Session
: 서버측에 데이터를 보관하는 방법
client에는 session id를 부여하고 client가 request에 sessionId를 보내면 id를 기준으로 일치 하는 session정보를
컨테이너가 생성하여 그 객체의 데이터를 가져와 사용함.
client가 보낸 sessionId가 없으면 새로 객체 생성

쿠키는 텍스트 파일 형태로 클라이언트 컴퓨터에 저장 된다.
다른 사용자와 함께 사용하는 컴퓨터인 경우 쿠키에 민감한 개인 정보를 담기에는 보안이 취약해지는 문제가 있다
따라서 민감한 개인 정보를 취급하는 경우에는 쿠키보다 세션을 이용하게 된다
세션은 쿠키와 유사한 형태로 key=value 쌍으로 저장 되지만 서버에서 관리되기 떄문에 보안에 더 우수하다


 

1. Cookie 사용 방법

속성설정
name=value : 아스키코드만 사용 가능. 한번 설정된 쿠기의 name은 수정 불가
expire='날짜' : 쿠키의 유지시간 설정 없으면 브라우저 동작 동안 유지
path='경로' : 쿠키가 전달되는 서버의 유효디렉터리를 지정하는 속성
domain='서버정보' : 쿠키가 전달되는 유효 서버 설정
secure : https나 ssl보안프로콜로 요청할때만 서버전송

- HTML 작성

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>cookie</title>
</head>
<body>

	<h1 align="center">Cookie handling</h1>
	
	<form action="cookie" method="post">
		<table>
			<tr>
				<td>firstName : </td>
				<td><input type="text" name="firstName"/></td>
			</tr>
			<tr>
				<td>lastName : </td>
				<td><input type="text" name="lastName"/></td>
			</tr>
			<tr>
				<td colspan="2" align="center">
					<button type="submit">전송</button>
				</td>
		    </tr>
		 </table>
	</form> 			
				
		</table>
	</form>
</body>
</html>



 

- 쿠키 생성 할 서블릿 작성 (쿠키설정전송)

 

1) Cookie클래스 생성
Cookie 쿠키명 = new Cookie("명칭", "값");
2) 생성된 쿠키설정
setMaxAge(int expiry) : 유효시간설정 (기본설정 시간은 30분)
setPath(String uri): 경로 설정 (특정 경로를 통한 요청시 쿠키를 사용하는 경우만)
setDomain(String domain) : 쿠키도메인 설정, 쿠키생성 (도메인 외의 도메인 설정시 사용)
3) 생성된 쿠키 전송
response.addCookie(Cookie cookie) : 생성된 쿠키 전송

@WebServlet("/cookie")
public class CookieHandlerServlet extends HttpServlet {
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
     request.setCharacterEncoding("UTF-8");
     
     1. 쿠키를 생성한다
     Cookie firstNameCookie = new Cookie("firstName",firstName); 키와 벨류로 전달
     Cookie lastNmaeCookie = new Cookie("lastName",lastName);
     
     2. 해당 쿠키의 만료 시간을 설정한다
     firstNameCookie.setMaxAge(60*60*24); 초 단위 설정으로 하루를 만료시간으로 둘 때의 예시
     lastNameCookie.setMaxAge(60*60*24);
     
     3. 응답 헤더에 쿠키를 담는다
     response.addCookie(firstNameCookie);
     response.addCookie(lastNameCookie);
     
     4.응답한다.
     response.sendRedirect("redirect");
     }
    }




 

- 응답할 페이지 서블릿 작성 (전송 cookie 활용)


1) client 전송한 cookie읽어오기
request.getCookies()메소드 활용, 쿠키객체 배열로 리턴
ex) Cookie[] list = request.getcookies();
2) 쿠키값 호출
getName() 과 getValue()를 이용하여 이름과 값 호출

@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
        쿠키 사용하기
        1. request에서 쿠키 목록을 쿠키 배열 형태로 꺼내온다.
        2. 쿠키의 getName과 getValue를 이용해 쿠키에 담긴 값을 사용한다.
        
        Cookie[] cookies = request.getCookies();
        for(int i = 0; i < cookies.length; i++) {
         
         if("firstName".equals(cookies[i].getName()))
         	firstName = cookies[i].getValue();
         else if("lastName".equals(cookies[i].getName()))
         	lastName = cookies[i].getValue();
        }
        
        StringBuilder reponseText = new StringBuilder();
        reponseText.append("<!doctype html\n")
		  		 .append("<html>\n")
		  		 .append("<head>\n")
		  		 .append("</head>\n")
		  		 .append("<body>\n")
		  		 .append("<h1 align = 'center'>")
		  		 .append("your first name is ")
		  		 .append(firstName)
		  		 .append("and last name is")
		  		 .append(lastName)
		  		 .append("</h1>")
		  		 .append("</body>\n")
		  		 .append("</html>");
		
		response.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		out.print(reponseText.toString());
		out.flush();
		out.close();
        
 }
}

 


2. Session 사용 방법

 

- Session설정 및 호출 할 서블릿 작성

1) Session 생성
HttpSession 세션명 = request.getSession();
=> HttpSession은 직접 생성할 수 없고, request에 있는 getSession() 메소드를 이용해서 리턴 받는다.
client가 보낸 sessionId값이 있으면 관련 객체 호출 sessionId 나 관련객체가 없으면 새로운 객체 생성
2) 생성된 session값 설정
세션명.setAttribute("이름"."값(obj)"); : 세션데이터 설정
세션명.setMaxInactivelnterval(숫자); : 세션유지시간 설정

@WebServlet("/session")
public class SessionHandlerServlet extends HttpServlet {
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     getSession() 메소드를 이용해서 리턴 받기
     HttpSession session = request.getSession();
     
     시간 설정
     session.setMaxInactiveInterval(60 * 10); 10분으로 설정
     
     session 값 설정
     session.setAttribute("firstName",firstName);
	 session.setAttribute("lastName", lastName);
     
     위임
     response.sendRedirect("redirect");
     
     }
    }



- session 사용할 서블릿 작성

@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    	앞서 작성한 페이지와 동일한 세션 아이디를 반환
        HttpSession session = request.getSession();
        
        동일한 아이디를 가진 세션에서는 setAttribute한 값을 getAttribute로 꺼내올 수 있다
        String firstName = (String) session.getAttribute("firstName");
		String lastName = (String) session.getAttribute("lastName");
        
        꺼내온 값을 이용해서 페이지에 응답용 html 전송
        StringBuilder reponseText = new StringBuilder();
		reponseText.append("<!doctype html\n")
		  		 .append("<html>\n")
		  		 .append("<head>\n")
		  		 .append("</head>\n")
		  		 .append("<body>\n")
		  		 .append("<h1 align = 'center'>")
		  		 .append("your first name is ")
		  		 .append(firstName)
		  		 .append("and last name is")
		  		 .append(lastName)
		  		 .append("</h1>")
		  		 .append("</body>\n")
		  		 .append("</html>");
		
		response.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		out.print(reponseText.toString());
		out.flush();
		out.close();
     }
    }

 

반응형

'프로그래밍 > Servlet&JPS' 카테고리의 다른 글

08 Servlet : listener  (0) 2022.08.24
07 Servlet : Filter  (0) 2022.08.24
05. Servlet : sendRedirect  (0) 2022.08.23
04. Servlet : forward  (0) 2022.08.23
03 Servlet : Error message 와 page 만들기  (0) 2022.08.23