
목표: HTTP의 무상태(stateless) 한계를 보완하는 Cookie(클라이언트 저장) · Session(서버 저장) 를 빠르게 정리
name=value 쌍 저장, 개수/크기 제한 존재name=value : ASCII, 이름은 불변Max-Age : 유효시간(초). 미설정 시 세션 쿠키(브라우저 종료 시 삭제)Path : 전송될 유효 경로Domain : 전송될 유효 도메인Secure : HTTPS에서만 전송HttpOnly : JS 접근 차단(XSS 완화) → cookie.setHttpOnly(true)// 생성
Cookie cookie = new Cookie("rememberId", "hong");
// 옵션
cookie.setMaxAge(60 * 60 * 24 * 7); // 7일
cookie.setPath("/"); // 전체 경로
cookie.setSecure(true); // HTTPS만
cookie.setHttpOnly(true); // JS 접근 금지
// 응답 헤더에 추가
response.addCookie(cookie);
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if ("rememberId".equals(c.getName())) {
String value = c.getValue();
// ... 사용
}
}
}
TIP: 민감 정보(토큰/개인정보)는 쿠키에 직접 저장하지 말고, 저장 시 Secure + HttpOnly 최소 적용.
| Scope | 공유 범위 |
|---|---|
| Page | 한 페이지(서블릿) 내부 |
| Request | forward 체인 동안 |
| Session | 같은 브라우저 세션 동안(로그인 정보 등) |
| Application | 애플리케이션 전역(모든 사용자) |
// 생성/획득 (기본 true: 없으면 생성)
HttpSession session = request.getSession();
// 저장/조회/삭제
session.setAttribute("loginUser", userDto);
UserDto loginUser = (UserDto) session.getAttribute("loginUser");
session.removeAttribute("loginUser");
// 전체 무효화(로그아웃/계정 전환 등)
session.invalidate();
코드: session.setMaxInactiveInterval(60 * 10); // 10분
앱 web.xml
<session-config>
<session-timeout>60</session-timeout> <!-- 분 -->
</session-config>
톰캣 conf/web.xml (전역 기본값)
실무 팁: 로그인 성공 시 기존 세션 무효화 후 재발급(세션 고정화 방지).
| 구분 | Cookie | Session |
|---|---|---|
| 저장 위치 | 클라이언트 | 서버 |
| 보안 | 낮음(노출 위험) | 높음 |
| 용량 | 작음(브라우저 제한) | 상대적으로 자유 |
| 유지 | 만료/삭제 전까지 | 타임아웃 또는 invalidate() |
| 사용 예 | 자동 로그인 체크, 최근 본 항목 | 로그인 상태, 권한, 장바구니 객체 |
new Cookie(name, value)setMaxAge(int), setPath(String), setDomain(String), setSecure(boolean), setHttpOnly(boolean)response.addCookie(cookie)request.getCookies()| 메서드 | 설명 |
|---|---|
getId() | 세션 ID |
getCreationTime() / getLastAccessedTime() | 생성/최근 접근 시간(ms) |
setMaxInactiveInterval(int) / getMaxInactiveInterval() | 비활성 만료(초) |
setAttribute/getAttribute/removeAttribute | 데이터 저장/조회/삭제 |
isNew() | 신규 세션 여부 |
invalidate() | 세션 무효화 |
invalidate()Secure, HSTS)