쿠키와 세션 - 세션

코코·2020년 8월 7일
1

Servlet/JSP

목록 보기
10/20

Session

웹 페이지들 사이에서 공유하는 정보를 서버에 저장해두고, 웹 페이지들을 매개한다는 점에서 세션도 쿠키와 다르지 않다. 다른 점이라면 쿠키는 클라이언트 PC에 저장되고, 세션은 서버 메모리에 저장된다는 점이다. 쿠키에 비해 보안이 좋기 때문에 로그인처럼 보안을 요구하는 데이터를 다룰 때 세션을 이용한다. 세션은 브라우저 당 하나가 생성된다.

세션의 특징

  • 데이터를 서버 메모리에 저장한다.
  • 블아줘의 세션 연동은 쿠키를 이용한다.
  • 쿠키보다 보안에 유리하다.
  • 서버에 부하를 줄 수 있다.
  • 브라우저 당 하나의 세션SessionID이 생성된다.
  • 세션은 유효시간을 가진다.(기본 30분)
  • 로그인 유지, 장바구니 등에 주로 사용한다.

세션 생성 과정

  1. 브라우저로 사이트에 접속한다.
  2. 서버는 접속한 브라우저에 대한 세션 객체를 생성한다.
  3. 서버는 생성한 세션 ID를 클라이언트 브라우저로 보낸다.(response)
  4. 브라우저는 서버에서 받은 세션ID를 브라우저가 사용하는 메모리의 세션 쿠키에 저장한다.
    쿠키 이름은 JSESSIONID
  5. 브라우저가 재접속하면 브라우저는 세션쿠키에 저장한 세션id를 서버에 전달한다.
  6. 서버는 전송받은 세션ID를 이용해 해당 세션에 접근하여 작업한다.

세션의 중요한 특징은 브라우저 당 하나씩 생성된다는 것이다. 브라우저가 서버에 JSESSIONID를 전송하면 서버는 그 값을 이용해서 브라우저를 구분한다.

세션API

HttpSessoin

서블릿은 HttpSession클래스를 이용해서 세션을 다룬다. HttpSession객체는 HttpServletRequest의 getSession()를 호출해서 생성한다.

  • getSession()
    기존 세션 객체가 존재하면 반환, 없으면 생성
  • getSession(true):기존 세션 객체가 존재하면 반환, 없으면 생성
  • getSession(false):기존 세션 객체가 존재하면 반환, 없으면 null

HttpSession클래스의 메서드

메서드설명
Object getAttribute(String name)지정한 이름을 가진 속성 값을 반환
Enumeration getAttributeNames()세션 속성 이름들을 Enumeration객체 타입으로 반환
long getCreationTime()1970년 1월 1일 0시 0초를 기준으로 현재 세션이 생성된 시간까지 경과한 시간을 계산하여 1/1000값으로 반환
String getId()세션에 할당된 고유 식별자를 반환
int getMaxInactiveInterval()현재 생성된 세션을 유지하기 위해 설정한 세션 유지시간을 int타입으로 변환
void invalidate()현재 생성된 세션을 소멸
boolean isNew()최초로 생성한 세션인지 기존에 생성된 세션인지 판별
void removeAttribute(String name)세션 속성 이름이 name인 속성을 제거
void setAttribute(String name, Object value)세션 속성 이름이 name인 속성에 속성 값으로 value를 할당한다.
void setMaxInactiveInterval(int interval)세션을 유지하기 위한 세션 유지 시간을 초 단위로 설정

HttpSession으로 세션 다루기

@WebServlet("/st")
public class SessionTest extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		//HttpSession객체 생성
		HttpSession session = request.getSession();
	
		out.println("세션 아이디 :" + session.getId()+"<br>");
		out.println("세션 생성 시간 : " + new Date(session.getCreationTime())+"<br>");
		out.println("최근 세션 접근 시각  : " + new Date(session.getLastAccessedTime())+ "<br>");
		//세션의 유효기간을 5초로 한다.
		session.setMaxInactiveInterval(5);
		out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() +"<br>");
		
		if (session.isNew()) {
			out.print("새 세션이 만들어졌습니다.");
		}
	}
}

유효기간 5초짜리 세션이다.

5초 뒤에 새로고침하면 새로운 세션이 생성된다.

DED7A38FD66953BF141A0EDA6231924C

2E9DB673F46CF57873B7377ED4F42C63

세션 로그인

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form name="login" method="post" action="/st2">
아이디 : <input type="text" name="id"><br>
비밀번호:<input type="password" name="password">
<button>확인</button>
</form>
</body>
</html>
@WebServlet(name = "SessionTest", urlPatterns = { "/st2" })
public class SessionTest extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		doHandle(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		doHandle(request, response);
	}
	
	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		//세션 객체 생성
		HttpSession session = request.getSession();
		//id, pw값을 받아온다.
		String id = request.getParameter("id");
		String pw = request.getParameter("password");
		
		System.out.println("id : " + id);
		System.out.println("pw : " + pw);
		
		if (session.isNew()){ //새 세션이라면,
			if(id != null){ //로그인 상태라면,
				session.setAttribute("id", id);	//세션에 id라는 이름으로 id를 바인딩한다.
				out.println("<a href='st2'>로그인 상태 확인</a>");	//다시 st2로 들어온다.
			}else {
				out.print("<a href='login.html'>다시 로그인 하세요!!</a>"); //로그아웃 상태라면 다시 로그인 창으로 돌려보낸다.
				session.invalidate();
			}
			
		} else { // 새 세션이 아닐 때 들어온다.
			id = (String) session.getAttribute("id"); //세션에 id라고 바인딩된 값을 받아온다.
			if (id != null && id.length() != 0) {	//해당 id가 있을 경우,
				out.print("안녕하세요 " + id + "님!!!");
			} else { //없다면 session을 지우고 login창으로 돌려보낸다.
				out.print("<a href='login2.html'>다시 로그인 하세요!!</a>");
				session.invalidate();
			}
		}
	}
}

1. 로그인

2.JSESSIONID 생성

로그인을 하면 JSESSIONID가 발급된다.
내부적으로는

if (session.isNew()){ //새 세션이라면,
	if(id != null){ //로그인 상태라면,
	session.setAttribute("id", id);	//세션에 id라는 이름으로 id를 바인딩한다.
	out.println("<a href='st2'>로그인 상태 확인</a>");	//다시 st2로 들어온다.
}else {
	out.print("<a href='login.html'>다시 로그인 하세요!!</a>"); //로그아웃 상태라면 다시 로그인 창으로 돌려보낸다.
	session.invalidate();
}

이 단계다. 새로 생성된 세션이 맞고, 로그인 상태이므로, 세션에 id를 바인딩한다.
그리고 '로그인 상태 확인'을 누르면,

3. JSESSIONID에 바인딩된 값 받아오기

내부적으로는

else { // 새 세션이 아닐 때 들어온다.
	id = (String) session.getAttribute("id"); //세션에 id라고 바인딩된 값을 받아온다.
	if (id != null && id.length() != 0) {	//해당 id가 있을 경우,
	out.print("안녕하세요 " + id + "님!!!");
	}

이 부분이다. session에 id라는 이름으로 바인딩된 객체를 꺼내서 화면에 출력한다.

0개의 댓글