개발하는 삶

[Spring] 쿠키, 세션, ajax 본문

Spring

[Spring] 쿠키, 세션, ajax

삶_ 2022. 8. 25. 12:35

 

세션 트래킹

  • 웹페이지의 상태나 정보를 공유
  • HTTP 프로토콜로 각각의 웹페이지를 요청해서 클라이언트의 브라우저에 표시해줌
    • HTTP 프로토콜은 각 웹페이지의 상태, 정보를
    • 다른 페이지와 공유하지 않는 stateless 방식으로 통신함
    • 따라서 웹페이지/서블릿 끼리 상태를 공유하려면 세션트래킹을 이용해야 함

 

웹페이지 연동법

  • <hidden>태그 : 태그를 이용해 웹페이지들 사이의 정보 공유
  • URL Rewriting : GET 방식으로 URL 뒤에 정보를 붙여 다른 페이지로 전송
  • 쿠키 : 클라이언트 PC의 Cookie 파일에 정보를 저장하고 웹페이지들이 공유
  • 세션 : 서버 메모리에 정보를 저장한 후 웹페이지들이 공유함

쿠키, 세션이 더 많이 쓰임!



쿠키

  • 웹페이지들 사이의 공유정보를 클라이언트 PC에 저장
  • 필요할 때 여러 웹페이지들이 공유해서 사용할 수 있게 매개역할을 함
  • 종류
    • Persistence 쿠키 : 파일로 생성. 쿠키를 삭제할경우까지 유지.
      • ex) 로그인 유무, 팝업창 제한
    • Session 쿠키 : 메모리에 생성. 브라우저 종료시까지 유지.
      • ex) 사이트 접속시 Session 인증 정보를 유지할 때



쿠키 실행 과정

  • 웹서버에서 쿠키를 생성 → 클라이언트에 전송
  • 브라우저는 쿠키를 파일로 저장
    • 다시 접속해 브라우저에게 쿠키 전송을 요청시,
    • 브라우저는 쿠키 정보를 서버에 전송.
    • 서버는 쿠키 정보를 이용해 작업함.




쿠키 API

  • 쿠키는 Cookie 클래스 객체 생성 후 정보전달
  • 서버에서 클라이언트로 전송해 파일로 저장됨
  • 전송 특징
    • HttpServletResponse 의 addCookie() : 클라이언트는 브라우저에 쿠키를 전송한 후 저장
    • HttpServletRequest 의 getCookie() : 쿠키를 서버로 가져옴



서블릿에서 쿠키 사용하기


SetCookieValue

package sec02.ex01;

@WebServlet("/set")
public class SetCookieValue extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    	throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		Date d = new Date(); // 날짜 출력용
		// 쿠키 객체 생성
		// "cookieTest" 이름으로 한글정보를 인코딩해서 쿠키에 저장
		Cookie c = new Cookie("cookieTest", URLEncoder.encode("JSP 프로그램입니다.","utf-8"));
		// setMaxAge : 쿠키의 유효기간 설정. 초단위 기준이라 저 식은 하루를 뜻함
        // c.setMaxAge(-1) : 음수로 지정해 세션 쿠키를 만듬 (브라우저 종료시까지 유지)
		c.setMaxAge(24*60*60);
		// 생성된 쿠키를 브라우저로 전송
		response.addCookie(c);
		
		out.println("현재시간 : "+d);
		out.println("문자열을 Cookie에 저장합니다.");
	}
}


GetCookieValue

package sec02.ex01;

@WebServlet("/get")
public class GetCookieValue extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		// 브라우저의 쿠키정보를 요청 => 배열에 담음
		Cookie [] allValues = request.getCookies();
		
		// 쿠키정보들을 가져옴
		// 가져온 정보 중 cookieTest와 이름이 같은 값을 찾음
		// decode : 인코딩한 결과를 디코딩함 (인코딩 해제)
		// 원본을 다시 "utf-8" 인코딩한다고 보면 됨
		for(int i=0; i<allValues.length; i++) {
			if(allValues[i].getName().equals("cookieTest")) {
				out.println("<h2>Cookie 값 가져오기 : "+URLDecoder.decode(allValues[i].getValue(), "utf-8"));
			}
		}
	}
}


결과값



쿠키 생성상태 확인하는 법






쿠키를 통해 팝업창 닫기



popUp.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	function setPopUpStart(obj) {
		if(obj.checked == true) {
			// 현재시간
			var expireDate = new Date();
			var days = 1;
			// 쿠키 유효시간에 들어갈 값 (끝나는 시간)
			expireDate.setDate(expireDate.getDate()+days);
			
			// expires 헤더 : 응답이 끝나는 시간
			// toGMTString() : 해당 객체를 더이상 사용하지 않음. 쿠키만료일자 쓸때 주로 사용함
			document.cookie = "notShowPop=" + "true" + ";path=/; expires="+expireDate.toGMTString();
			
			window.close();
		}
	}
</script>
</head>
<body>
	알림 팝업창입니다.
	<br><br><br><br><br><br><br>
	<form>
		<!-- 체크하면, setPopUpStart(해당 input창 가리킴) 실행 -->
		<input type=checkbox onClick="setPopUpStart(this)">오늘 더 이상 팝업창 띄우지 않기
	</form>
</body>
</html>


popupTest.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	window.onload = pageLoad;
	function pageLoad(){
		// 함수 값 넣기
		notShowPop = getCookieValue();
		// 팝업창 막기 = false 이면 실행
		console.log(notShowPop);
		if(notShowPop == "false"){
			// 팝업창 생성
			window.open("popUp.html","pop","window=400, height=500, history=no, resizable=no, status=no,scrollbars=yes,menubar=no");
		}
	}
	
	function getCookieValue(){
		var result = "false";
		if(document.cookie != ""){
			// document.cookie : 쿠키 정보 문자열로 가져오고, ;로 구분해 각각의 쿠키 얻기
			cookie = document.cookie.split(";");
			for(var i=0; i<cookie.length; i++){
				element = cookie[i].split("=");
				value = element[0];
				// 정규식으로 문자열의 공백(스페이스바) 제거한 문자열 만들기
				value = value.replace(/^\s*/,'');
				// 쿠키 이름이 notShowPop 이면, 해당되는 쿠키값을 반환
				if(value=="notShowPop"){
					result = element[1];
				}
			}
		}
		return result;
	}
	
	function deleteCookie(){
		// 쿠키 삭제시, 팝업창막기 = false // 팝업창 보여줌.
		document.cookie = "notShowPop=" + "false" + ";path=/; expires=1";
	}
</script>
</head>
<body>
	<form>
		<input type=button value="쿠키삭제" onClick="deleteCookie()">
	</form>
</body>
</html>



세션

  • 쿠키는 웹페이지들의 정보가 클라이언트 PC에 저장되므로 정보가 노출될수있음
  • 세션은 서버의 메모리에 생성되므로 보안이 요구되는 ‘로그인’ 서비스 등에 활용 가능

 

세션 기능 실행 과정

  • 브라우저로 사이트에 접속
  • 서버는 접속한 브라우저에 대한 세션 객체 생성
    • 생성된 세션 id를 클라이언트 브라우저에 응답함
  • 브라우저서버로부터 받은 세션 id
    • 브라우저에 사용하는 메모리의 세션 쿠키에 저장함
    • 브라우저가 재접속하면 브라우저는 세션쿠키에 저장된 세션 id를 서버에 전달함
  • 서버는 전송된 세션 id를 이용해 해당 세션에 접근하여 작업 수행함

 

세션 API의 특징과 기능

  • HttpSession 클래스 객체 생성해 세션 이용
  • HttpSessionRequest 의 getSession() 호출해 생성
    • getSession() : 기존의 세션객체가 존재하면 반환. 없으면 새로 생성  (= getSession(true))
    • getSession(false) : 기존의 세션객체가 존재하면 반환. 없으면 null 반환
  • 메서드
    • getAttribute(String name) : 속성이름이 name인 속성값을 Object 타입으로 반환
      • 없으면 null 반환
    • setAttribute(String name, Object value) : 속성이름이 name인 속성값을 value로 할당
    • removeAttribute(String name) : 속성이름이 name인 속성을 제거
    • getId() : 세션에 할당된 고유식별자를 String 타입으로 반환
    • invalidate() : 현재 생성된 세션 소멸




서블릿에서 세션 API 이용하기

package sec03.ex01;

@WebServlet("/sess")
public class SessionTest extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		// 세션 생성
		HttpSession session = request.getSession();
		
		// getId : 생성된 세션 객체의 id를 가져옴
		out.println("세션 아이디: "+session.getId()+"<br>");
		// 최초 세션 객체 생성시간을 가져옴
		out.println("최근 세션 생성 시각 : "+new Date(session.getCreationTime())+"<br>");
		// 세션 객체에 가장 최근에 접근한 시간을 가져옴
		out.println("최초 세션 접근 시각 : "+
				new Date(session.getLastAccessedTime())+"<br>");
		// getMaxInactiveInterval : 세션 유지 시간을 int 타입으로 반환
		out.println("세션 유효 시간 : "+session.getMaxInactiveInterval()+"<br>");
		
		// 최근에 생성된 세션인지 확인 (true)
		// 한번 세션 생성 후에는 이 문장이 출력되지 않음
		if(session.isNew()) {
			out.print("새 세션이 만들어졌습니다.");
		
	}
}


결과값






 

ajax

  • ajax 로 데이터 보내기
  • 데이터 전송 방식
    • get 방식으로 쿼리파라미터 전달 : requestParam
    • form : post 방식으로 쿼리파라미터 형식으로 메시지 바디에 보냄
      • 보통 dto 등 담을 객체가 있다면 ModelAttribute 로 받아줌
      • Formdata 는 파일과 함께 보낼때 주로 사용함 (Content-Type : multipart/form-data)
    • http 메세지 바디로 보내기 : 주로 json
  • @Requestparam : 쿼리파라미터 형식으로 올 때
  • @RequestBody : 메시지 바디 형태로 올때. 주로 JSON. http 요청의 본문이 그대로 자바 객체로 변환되어 오는것.

 

 

 

'Spring' 카테고리의 다른 글

[Spring] SqlSession, 트랜잭션  (0) 2022.10.04
[Spring] 스코프, 필터  (0) 2022.08.29
[Spring] 스프링과 서블릿, 바인딩  (0) 2022.08.24
[Spring] servlet  (0) 2022.08.18
[Spring] 로그인, 스프링 시큐리티  (0) 2022.08.18