1. 세션 (Session)
- 개념: 사용자가 웹 사이트에 접속해서 머무르는 동안 (일정 시간 동안) 서버에 유지되는 사용자별 정보.
- 특징:
- 서버에 저장: 사용자 정보는 서버에 저장됨.
- 고유 ID: 각 사용자에게 고유한 세션 ID가 부여됨. (주로 쿠키를 통해 전달)
- 보안: 서버에 정보가 저장되므로 쿠키보다 상대적으로 안전.
- 만료: 브라우저 종료, 지정된 시간 동안 활동 없음, 서버에서 명시적으로 세션 종료 시 만료됨.
- 용도:
- 로그인 정보 유지 (사용자 인증)
- 장바구니 기능
- 사용자별 맞춤 설정 (테마, 언어 등)
- 최근 본 상품 목록
- 특징:
2. 쿠키 (Cookie)
- 개념: 웹 사이트가 사용자의 브라우저에 저장하는 작은 텍스트 파일.
- 특징:
- 클라이언트에 저장: 사용자 정보는 브라우저에 저장됨.
- 텍스트 형태: 이름-값 쌍으로 구성된 텍스트 데이터.
- 만료 기간: 쿠키마다 만료 기간을 설정할 수 있다. (브라우저 종료 시, 특정 시간 후, 영구적)
- 보안: 클라이언트에 저장되므로, 탈취나 변조 위험이 있다. (HTTPS, HttpOnly 설정 등으로 보안 강화)
- 용량 제한: 브라우저마다 쿠키 개수와 크기에 제한이 있다.
- 용도:
- 자동 로그인
- 팝업 "오늘 하루 보지 않기"
- 장바구니 (세션 없이도 구현 가능)
- 사용자 선호 설정 (테마, 언어 등)
- 광고 타겟팅 (사용자 행동 추적)
- 특징:
핵심 비교
특징세션 (Session)쿠키 (Cookie)
저장 위치 | 서버 | 클라이언트 (브라우저) |
정보 형태 | 객체 (Object) | 텍스트 (String) |
보안 | 상대적으로 안전 | 취약 (HTTPS, HttpOnly 등으로 보완) |
용량 | 서버 메모리 허용 범위 내 | 브라우저별 제한 (개수, 크기) |
만료 | 브라우저 종료, 설정된 시간, 명시적 종료 | 브라우저 종료(세션 쿠키), 설정된 시간, 명시적 삭제 |
3. HttpSession 인터페이스
HttpSession은 서버 측에 클라이언트별로 정보를 저장하는 기술. 각 클라이언트는 고유한 세션 ID를 가지며, 서버는 이 ID를 사용하여 클라이언트를 식별하고 해당 클라이언트의 세션 데이터를 관리.
- 세션 생성 및 획득:
- HttpServletRequest.getSession():
- 현재 요청과 연결된 세션이 있으면 해당 세션을 반환.
- 세션이 없으면 새로운 세션을 생성하여 반환.
- HttpServletRequest.getSession(boolean create):
- create가 true이면, 세션이 없으면 새 세션을 생성하고, 있으면 기존 세션을 반환.
- create가 false이면, 세션이 없으면 null을 반환하고, 있으면 기존 세션을 반환.
- HttpServletRequest.getSession():
- 세션 ID:
- HttpSession.getId(): String - 세션의 고유 ID를 반환. (서버가 자동으로 생성)
- 세션 속성 (Attributes):
- HttpSession.setAttribute(String name, Object value): 세션에 속성을 추가. (이름-값 쌍)
- HttpSession.getAttribute(String name): Object - 지정된 이름의 속성 값을 반환. (없으면 null)
- HttpSession.getAttributeNames(): Enumeration - 세션에 저장된 모든 속성 이름들을 반환.
- HttpSession.removeAttribute(String name): 지정된 이름의 속성을 제거.
- 세션 유효 시간 (Timeout):
- setMaxInactiveInterval(int interval): 세션의 최대 비활성 시간(초 단위)을 설정. 이 시간 동안 클라이언트의 요청이 없으면 세션이 만료.
- getMaxInactiveInterval(): int - 세션의 최대 비활성 시간(초)을 반환.
- 기본값은 서버 설정에 따름. (일반적으로 30분)
- 0 또는 음수 값을 설정하면 세션이 만료되지 않는다. (주의해서 사용)
- 세션 무효화:
- HttpSession.invalidate(): 세션을 무효화. 세션에 저장된 모든 데이터가 삭제되고, 해당 세션 ID는 더 이상 유효하지 않는다. (로그아웃 처리 시 사용)
- 기타
- isNew(): boolean, 해당 세션이 새롭게 만들어진 세션인가를 반환
- getCreationTime(): long - 세션 생성 시간을 long 타입(timestamp)으로 반환.
- getLastAccessedTime(): long - 마지막으로 세션에 접근한 시간을 long 타입(timestamp)으로 반환.
HttpSession 사용 예시 (로그인 정보 저장):
Java
// 로그인 처리 서블릿
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// ... (아이디, 비밀번호 확인) ...
if (loginSuccess) {
HttpSession session = request.getSession(); // 세션 생성 또는 획득
session.setAttribute("userId", userId); // 세션에 사용자 ID 저장
session.setMaxInactiveInterval(60 * 30); // 30분 동안 세션 유지 (선택 사항)
response.sendRedirect("main.jsp"); // 메인 페이지로 이동
} else {
// ... (로그인 실패 처리) ...
}
}
Java
<%-- main.jsp --%>
<%
String userId = (String) session.getAttribute("userId"); // 세션에서 사용자 ID 가져오기
if (userId != null) {
%>
<p>Welcome, <%= userId %>!</p>
<a href="logout">Logout</a>
<%
} else {
%>
<p>Please login.</p>
<a href="login.jsp">Login</a>
<%
}
%>
2. Cookie 클래스
Cookie는 클라이언트 측(웹 브라우저)에 저장되는 작은 텍스트 정보. 서버는 HttpServletResponse.addCookie() 메서드를 사용하여 클라이언트에 쿠키를 설정하고, 클라이언트는 이후 요청 시 HttpServletRequest.getCookies() 메서드를 통해 쿠키를 서버에 다시 보냄.
- Cookie 객체 생성:
- Cookie(String name, String value): 쿠키 이름과 값을 지정하여 Cookie 객체를 생성.
- 쿠키 이름은 반드시 ASCII문자
- 주요 Cookie 메서드:
- getName(): String - 쿠키 이름을 반환.
- getValue(): String - 쿠키 값을 반환.
- setValue(String newValue): 쿠키 값을 설정.
- setMaxAge(int expiry): 쿠키의 만료 시간(초 단위)을 설정.
- 양수: 지정된 시간(초) 후에 만료
- 0: 쿠키 즉시 삭제
- -1 (기본값): 브라우저 종료 시 만료 (세션 쿠키)
- getMaxAge(): int - 쿠키의 만료 시간(초)을 반환.
- setPath(String uri): 쿠키가 유효한 경로를 설정. (해당 경로 및 하위 경로에서만 쿠키 전송)
- / 일경우, 모든 경로에서 사용 가능
- getPath(): String - 쿠키의 유효 경로를 반환.
- setDomain(String domain): 쿠키가 유효한 도메인을 설정. (해당 도메인 및 서브 도메인에서만 쿠키 전송)
- getDomain(): String - 쿠키의 유효 도메인을 반환.
- setSecure(boolean flag): true로 설정하면 HTTPS 연결에서만 쿠키가 전송됨.
- getSecure(): boolean - HTTPS 전용 쿠키인지 여부를 반환.
- setHttpOnly(boolean httpOnly): true로 설정하면 JavaScript에서 쿠키에 접근할 수 없다. (XSS 공격 방지)
- isHttpOnly() : boolean, HttpOnly 설정 여부 반환
Cookie 사용 예시 (자동 로그인):
Java
// 로그인 처리 서블릿
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// ... (아이디, 비밀번호 확인) ...
if (loginSuccess) {
// 자동 로그인 체크박스가 선택되었으면
if (request.getParameter("rememberMe") != null) {
// 쿠키 생성 및 설정
Cookie idCookie = new Cookie("userId", userId); // 쿠키 이름: userId, 값: 사용자 ID
idCookie.setMaxAge(60 * 60 * 24 * 7); // 7일 동안 유지
idCookie.setPath("/"); // 웹 애플리케이션 전체에서 사용 가능
response.addCookie(idCookie); // 응답에 쿠키 추가
}
HttpSession session = request.getSession();
session.setAttribute("userId", userId);
}
}
Java
<%-- 로그인 페이지 (login.jsp) --%>
<%
Cookie[] cookies = request.getCookies(); // 브라우저가 보낸 쿠키 가져오기
String savedUserId = "";
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("userId")) {
savedUserId = cookie.getValue();
break;
}
}
}
%>
<form action="login" method="post">
ID: <input type="text" name="userId" value="<%= savedUserId %>"><br>
Password: <input type="password" name="password"><br>
<input type="checkbox" name="rememberMe"> Remember Me<br>
<input type="submit" value="Login">
</form>
3. HttpSession vs. Cookie
특징HttpSessionCookie
저장 위치 | 서버 | 클라이언트 (웹 브라우저) |
저장 데이터 타입 | 모든 Java 객체 | 문자열 (String) |
보안 | 상대적으로 안전 (서버에 저장) | 취약 (클라이언트에 저장, 탈취 가능성) |
용량 제한 | 서버 메모리 허용 범위 내 | 브라우저별 제한 (개수, 크기) |
사용 예시 | 로그인 정보, 장바구니, 사용자 설정 등 | 자동 로그인, 사용자 선호 설정(테마, 언어), 최근 본 상품 등 |
생명 주기 | 서버 설정 또는 setMaxInactiveInterval()로 지정한 시간 동안, 혹은 invalidate() 호출 시 | setMaxAge()로 지정한 시간 동안, 브라우저 종료 시(세션 쿠키), 또는 명시적으로 삭제할 때까지 |
특징 | 서버 부하, 보안 좋음, 데이터 타입 제한 없음 | 서버 부하 적음, 클라이언트에 정보 저장, 보안 취약(HTTPS, HttpOnly 등으로 보완 필요), 문자열만 저장 가능 |
'개발 > servlet' 카테고리의 다른 글
PRG(Post-Redirect-Get) 패턴 (0) | 2025.03.05 |
---|---|
MVC 패턴 (0) | 2025.03.05 |
ServletConfig 인터페이스 정리 (0) | 2025.03.05 |
ServletContext 인터페이스 정리 (0) | 2025.03.05 |
Servlet RequestDispatcher 정리 (0) | 2025.03.05 |