둘 다 메모리에 key-value 속성 저장이 가능하지만 범위 , 수명 , 공유 대상이 다르다.
| 구분 | application(ServletContext) | session(HttpSession) |
|---|---|---|
| 범위(Scope) | 웹앱 전체(전역) | 사용자 (브라우저) 1명 |
| 생성 | 앱 시작 | 사용자 최초 접속 |
| 수명 | 앱 시작-종료 (재배포/재시작 시 초기화) | 세션 생성-만료 (기본 30분 유휴 시 만료) |
| 공유 대상 | 모든 서블릿 / 필터 / JSP | 같은 사용자의 모든 요청/탭 |
| 사용 예 | 전역 설정값 , 공용 캐시 핸들 , 레지스트리 | 로그인 정보 , 장바구니 , 개인 설정 |
| 스레드 | 다수 스레드 종시 접근 (전역) 👉 동시성 주의 | 동일 사용자라도 탭/동시요청으로 경합 가능 |
| 크기/부하 | 전 사용자 공용이므로 과도하면 전반 영향 | 사용자 수 * 세션 크기 👉 메모리/복제 비용 커짐 |
| 클러스터 | 노드 간 자동 공유 아님(보통) | 컨테이너 설정으로 세션 복제 가능 |
| 저장 위치 | 서버 메모리(전역) , 영속❌ | 서버 메모리(사용자별) , 영속❌ |
| 대표 API | getServletContext() / application.getAttribute() | request.getSession() / session.getAttribute() |
// Servlet
@Override
public void init() {
getServletContext().setAttribute("cdnBaseUrl", "https://cdn.example.com");
}
// JSP
CDN: ${applicationScope.cdnBaseUrl}
// Servlet (로그인 성공 시)
request.getSession().setAttribute("loginUser", userDto);
<!-- JSP -->
<c:if test="${not empty sessionScope.loginUser}">
안녕하세요, ${sessionScope.loginUser.name}님
</c:if>
request.setAttribute(...) 👉 forward (페이지 바인딩용)sessionapplication동시성
application에 넣는 가변 객체는 ConcurrentHashMap , Atomic* 등으로 스레드 안전하게session도 같은 사용자가 여러 탭에서 동시에 호출할 수 있어 경합 가능용량 관리
만료/타임아웃
web.xml 또는 설정으로 조정 필요 시 session.invalidate()로 명시 종료클러스터링
application 전역 공유가 노드 간 자동 동기화 되는 건 아님 👉 외부 스토어(예 : Redis) 고려보안
JSESSIONID는 쿠키(또는 URL 재작성)로 식별됨 - HTTPS , HttpOnly 설정 확인| 메서드 | 설명 |
|---|---|
setAttribute(name, value) | 앱 전역 키에 객체 저장(기존 값이면 교체) |
getAttribute(name) | 전역 키로 객체 조회 |
removeAttribute(name) | 전역 키 제거 |
getAttributeNames() | 전역 저장소의 키 나열 |
getInitParameter(name) | web.xml의 <context-param> 값 읽기 |
getContextPath() | 애플리케이션 컨텍스트 경로(/myapp) |
getResourceAsStream(path) | 리소스를 읽기용 InputStream으로 획득 |
getRequestDispatcher(path) | 내부 forward/include용 디스패처 반환 |
getMimeType(file) | 파일명으로 MIME 타입 추정 |
log(msg) | 컨테이너 로그에 메시지 기록 |
전체 메서드 목록 공식 문서 참고: ServletContext Javadoc (Jakarta 6.0). jakarta.ee
(참고: javax Servlet 4.0 Javadoc도 필요 시 확인) Javadoc
| 메서드 | 설명 |
|---|---|
setAttribute(name, value) | 사용자 세션에 값 저장 |
getAttribute(name) | 세션 값 조회 |
removeAttribute(name) | 세션 값 제거 |
getAttributeNames() | 세션 키 나열 |
getId() | 현재 세션 ID 반환 |
isNew() | 이번 요청에서 막 생성된 세션인지 |
getCreationTime() | 세션 생성 시각(ms) |
getLastAccessedTime() | 마지막 접근 시각(ms) |
setMaxInactiveInterval(seconds) | 유휴 타임아웃(초) 설정 |
invalidate() | 세션 무효화(로그아웃 등) |
전체 메서드 목록 공식 문서: HttpSession Javadoc (Jakarta 6.0). jakarta.ee
(참고: javax Servlet 4.0/EE7 Javadoc도 필요 시 확인) Oracle Docs