본문 바로가기

TIL

<자바 Java> 쿠키(Cookie)와 세션(Session)

- 세션 트래킹(Session Tracking)

HTTP 프로토콜로 통신하는 웹 페이지들끼리는 그 특성상(stateless 방식) 서로의 상태나 정보에 대해 알 수 없다. 따라서 서버 단에서는 이를 포워딩이나 바인딩을 통해 처리해주는 것인데, 클라이언트 관점에서는 이를 '세션 트래킹(Session Tracking)' 기능으로 개발자가 구현하고, 웹 페이지들간에 서로의 상태를 알고 정보 공유를 할 수 있도록 만들어준다. 보통 이러한 정보 공유는 DB를 통해 이루어지지만, 동시 사용자 수가 많아지는 경우 속도가 느려질 수 있어 보다 빠른 속도로 이용하기 위해 세션 트래킹 방법을 사용한다.

*데이터 연동 : DB 저장 <-> 세션 트래킹 - 클라이언트 PC, 서버 메모리 등 저장

 

가장 큰 예로 한 웹 서비스에 회원가입을 하고 로그인을 했을 때에, 세션 트래킹 기능이 적용되어 있지 않다면 현재 있던 페이지를 벗어나 다른 페이지로 이동했을 때 로그인 정보는 사라진다. 따라서 매 페이지마다 로그인을 새로 해주어야 하는 것이다. 하지만 세션 트래킹 기능을 만들어주면 이럴 때 페이지 간 로그인 정보가 공유되고 있기 때문에 매 페이지마다 로그인을 해야 할 필요 없이 서비스를 이용할 수 있다.

 

이러한 세션 트래킹의 방법으로는 다음과 같은 것들이 있다.

 

1) <hidden> 태그 : HTML의 <hidden> 태그로 웹 페이지들 간 데이터를 공유한다.

// 보내는 쪽
<form action="폼 내용을 전송할 서블릿의 매핑명">
	<input type="hidden" name="데이터 이름" value="데이터 값">
</form>
// 받는 쪽
데이터타입 변수명 = request.getParameter("데이터 이름");

 

2) URL Rewriting : GET 방식으로 URL 뒤에 데이터를 붙여 다른 페이지로 전송한다.

// 보내는 쪽
out.print("<a href='/전송할 다른 서블릿 매핑명?데이터명="+데이터 값을 담은 변수명'></a>
// 받는 쪽
데이터타입 변수명 = request.getParameter("데이터명");

 

위 1), 2)의 두 가지 방법은 적은 양의 데이터, 그리고 보안이 크게 중요한 사항이 아닐 때 사용하는 것이 좋다. 전송할 수 있는 데이터 용량에 한계가 있고, GET 방식으로 전송하여 보안상으로 좋지 않기 때문이다.

 

 

3) 쿠키(Cookie) : 클라이언트 PC의 쿠키 파일에 데이터를 저장하여 웹 페이지들끼리 공유한다.

클라리언트의 PC에 데이터를 저장하므로 보안에 취약하여, 보안과 무관한 경우에 사용한다. 가장 많이 사용되는 예로는 웹 홈페이지 접속 시 나타나는 팝업창에 대해 '오늘은 더 이상 보지 않기'에 체크하여 사용할 때 쿠키를 이용한다.

 

쿠키를 이용한 데이터 전송 과정은 다음과 같다.

브라우저로 사이트에 접속 -> 서버가 데이터를 저장한 쿠키 생성하여 브라우저로 전송 -> 브라우저는 서버에서 받은 쿠키를 쿠키 파일로 저장 -> 브라우저가 재접속 -> 서버는 해당 브라우저에 맞는 데이터 처리 위해 브라우저에게 지난번 받은 쿠키 전송 요청 -> 브라우저는 쿠키 정보를 서버로 전달 -> 서버가 받은 쿠키 정보로 작업

 

 

쿠키는 두 종류가 있다.

- Persistence 쿠키 : 클라이언트에 파일로 정보 저장, 사용자가 만료 시간 지정 가능, setMaxAge()(쿠키 유효 시간 설정) 메서드에 인자 값으로 양수 설정하여 파일에 저장하면 생성됨

- Session 쿠키 : 브라우저가 사용하는 메모리에 생성, 브라우저 종료 시 자동 소멸, 세션(Session)과 같이 사용됨, setMaxAge() 메서드에 인자 값으로 음수를 설정하거나 해당 메서드를 사용하지 않는 경우 Persistence가 아닌 Session 쿠키로 저장됨

// Persistence 쿠키 예시
Cookie c = new Cookie("쿠키 이름");
c.setMaxAge(유효 기간 설정 -> 양수이면 Persistence);
response.addCookie(c);
// 저장된 쿠키 가져오기
Cookie 변수명 = request.getCookies(); // 쿠키 정보 가져옴
변수명.getValue(); // 쿠키에 저장된 값 가져옴

 

 

4) 세션(Session) : 서버의 메모리에 데이터를 저장하여 웹 페이지들이 공유할 수 있도록 한다.

세션은 쿠키와 달리 웹 페이지들의 정보가 클라이언트 PC가 아닌, 서버의 메모리에 저장된다. 따라서 로그인 정보와 같은 보안이 필요한 데이터는 세션을 이용한다. 세션은 브라우저당 한 개, 즉 사용자당 한 개가 생성된다. 이러한 특성 때문에 로그인 정보나 쇼핑몰인 경우 장바구니에 담은 상품들에 대한 정보를 저장할 때에 세션을 이용하는 것이다.

 

세션을 이용한 데이터 전송 과정은 다음과 같다.

브라우저로 사이트에 접속 -> 서버가 접속한 브라우저에 대해 세션 객체를 생성하고 세션 객체에 대한 id를 브라우저로 전송 -> 브라우저는 세션 id를 받아 브라우저가 사용하는 메모리의 세션 쿠키에 저장(jsessionId) -> 브라우저 재접속 시 세션 쿠키에 저장했던 세션 id를 서버에 전달 -> 서버는 받은 세션 id를 이용하여 해당 세션에 접근, 작업 수행

 

세션은 HttpSession 클래스 객체를 사용하는데, HttpSession 객체는 HttpServletRequest의 getSession() 메서드를 호출하여 생성한다.

// 저장할 때
HttpSession session = request.getSession();
session.setAttribute("저장할 데이터 이름", 받아온 데이터의 값을 저장한 변수명);

// 가져올 때
session.getAttribute("저장한 데이터 이름")

 

 

 

 

 

참고 : 도서 <자바 웹을 다루는 기술>