세션(Session)과 쿠키(Cookie) 완벽 정리: 정의, 동작 원리, 차이점
웹 애플리케이션을 개발하다 보면 반드시 만나게 되는 개념이 바로
세션(Session)과 쿠키(Cookie)입니다.
HTTP는 기본적으로 상태가 없는(stateless) 프로토콜이기 때문에,
로그인 정보나 장바구니처럼 “사용자 상태”를 유지하려면 별도의 메커니즘이 필요합니다.
이 글에서는 Servlet 기반 환경을 기준으로
HttpSession과 Cookie를 어떻게 사용하는지,
그리고 두 방식의 차이점과 장단점까지 한 번에 정리합니다.
목차
- 세션(Session)의 정의와 특징
- HttpSession 주요 메서드 정리
- 쿠키(Cookie)의 정의와 동작 방식
- 쿠키 생성 및 전송 방법
- 세션과 쿠키의 차이점 비교
- 자주 묻는 질문(FAQ)
1. 세션(Session)의 정의와 특징
세션(Session)은 웹 서버 쪽의 웹 컨테이너에 사용자 상태 정보를 저장해 두고,
이후 요청에서도 동일한 사용자인지를 식별하기 위해 사용하는 기술입니다.
Java Servlet 환경에서는 javax.servlet.http 패키지의
HttpSession 인터페이스를 통해 세션을 사용할 수 있습니다.
세션의 핵심 특징
- 서버 측 저장 사용자의 상태 정보는 브라우저가 아니라 웹 서버(웹 컨테이너)에 저장됩니다.
- 고유 ID로 식별 서버는 각 클라이언트에 대해 고유한 세션 ID를 부여하고, 브라우저에서 오는 요청의 세션 ID를 비교하여 같은 사용자임을 구분합니다.
- 브라우저 단위로 생성
일반적으로 웹 브라우저 1개당 세션 1개가 생성되며,
같은 창/탭에서 열려 있는 페이지들은 동일한
session객체를 공유합니다. - 보안 측면에서 쿠키보다 유리 민감한 정보는 브라우저에 직접 저장하지 않고 서버에 저장하기 때문에 단순 쿠키보다 보안에 유리한 편입니다.
즉, 세션은 서버에 상태를 저장하고, 세션 ID만을 클라이언트와 주고받는 방식으로 상태를 유지합니다.
2. HttpSession 주요 메서드 정리
HttpSession 객체는 로그인 정보, 사용자 권한, 장바구니 데이터 등
여러 상태 값을 저장하고 관리할 수 있게 해 줍니다.
아래는 자주 사용하는 메서드들입니다.
2-1. 세션 속성 접근: getAttribute / setAttribute / removeAttribute
-
Object getAttribute(String name)
지정한name에 해당하는 세션 속성값을 반환합니다. 해당 이름이 없으면null을 반환합니다.
예)String memId = (String) session.getAttribute("memId"); -
void setAttribute(String name, Object value)
세션에 새로운 속성값을 저장 예)session.setAttribute("memId", "testUser"); -
void removeAttribute(String name)
지정한 이름의 세션 속성을 삭제합니다.
예)session.removeAttribute("memId");
2-2. 세션 생성 시간, ID, 유지 시간
-
long getCreationTime()
현재 세션이 언제 생성되었는지를 밀리초(1/1000초) 단위로 반환합니다. 기준 시점은 1970-01-01 00:00(UTC)입니다. -
String getId()
세션에 할당된 고유 세션 ID를 반환합니다. 이 값으로 브라우저에서 발생한 여러 요청이 같은 세션인지 식별합니다. -
int getMaxInactiveInterval()
현재 세션이 유지될 수 있는 최대 비활성 시간(초 단위)을 반환합니다. 이 시간이 지나도록 요청이 없으면 세션은 무효화됩니다. -
void setMaxInactiveInterval(int interval)
세션의 최대 유지 시간(초 단위)을 지정합니다.
예) 30분 유지:session.setMaxInactiveInterval(30 * 60);
2-3. 세션 무효화: invalidate()
-
void invalidate()
현재 생성된 세션을 즉시 무효화합니다. 일반적으로 로그아웃 처리에 사용됩니다.
예)session.invalidate();
3. 쿠키(Cookie)의 정의와 동작 방식
쿠키(Cookie)는 상태를 유지하지 않는 HTTP 프로토콜 위에서 사용자의 상태를 브라우저에 저장해 두는 방법입니다. 작은 텍스트 데이터(보통 4KB 이하)를 브라우저에 저장해 두었다가, 이후 같은 서버로 요청을 보낼 때 해당 쿠키 정보를 함께 전송합니다.
쿠키의 기본 동작 흐름
- 서버(서블릿)가
Cookie객체를 생성하고, 응답 헤더에 추가한다. - 브라우저는 응답을 받으며 쿠키를 로컬에 저장한다.
- 이후 같은 도메인/경로로 요청을 보낼 때, 저장된 쿠키를 요청 헤더에 포함해서 전송한다.
- 서버는 요청에 포함된 쿠키 값을 읽어 이전 상태를 복원한다.
Java Servlet에서는 javax.servlet.http 패키지의
Cookie 클래스를 사용해 쿠키를 다룹니다.
쿠키는 “이름(name) - 값(value)” 쌍을 기본으로 하고,
유효 기간, 도메인, 경로 등의 속성을 추가로 설정할 수 있습니다.
쿠키의 특징과 보안 이슈
- 클라이언트(브라우저) 저장 쿠키 값은 브라우저에 저장되므로, 사용자가 직접 삭제하거나 브라우저의 쿠키 거부 설정에 따라 동작이 달라질 수 있습니다.
- 개인 정보 노출 위험 방문 기록, 로그인 정보 등의 데이터가 브라우저에 남기 때문에 개인 정보 및 사생활 침해 소지가 있습니다. 민감한 값은 가급적 세션이나 토큰 기반 방식으로 관리하는 것이 안전합니다.
- 쿠키 거부 시 기능 제한 사용자가 브라우저에서 쿠키를 차단해 두면, 로그인 유지, 장바구니 등 쿠키에 의존한 기능은 정상적으로 동작하지 않을 수 있습니다. 이것이 쿠키의 가장 큰 단점 중 하나입니다.
4. 쿠키 생성 및 전송 방법 (Servlet 기준)
4-1. 쿠키 구성 요소
- 이름(name) : 쿠키를 식별하기 위한 문자열.
알파벳과 숫자만 사용해야 하며,
$로 시작할 수 없고 콤마(,), 세미콜론(;), 공백 등의 문자를 포함할 수 없습니다. - 값(value) : 실제로 저장하고 싶은 데이터. 공백, 괄호, 등호(=), 콤마, 콜론(:), 세미콜론(;) 등을 포함하려면 URL 인코딩 처리가 필요합니다.
- 유효기간(Max-Age) : 쿠키가 유지되는 시간(초 단위).
- 도메인(Domain), 경로(Path) : 쿠키가 전송될 대상 서버와 경로 범위를 결정합니다.
4-2. 쿠키 생성
Cookie cookie = new Cookie("userId", "testUser");
여기서 "userId"는 쿠키 이름, "testUser"는 쿠키 값입니다.
4-3. 쿠키 추가(응답에 실어 보내기)
// 쿠키 생성
Cookie cookie = new Cookie("userId", "testUser");
// 쿠키 유효기간(초 단위) 설정: 7일
cookie.setMaxAge(7 * 24 * 60 * 60);
// 응답에 쿠키 추가
response.addCookie(cookie);
나중에 쿠키 값을 변경할 때는 setValue()를 사용합니다.
cookie.setValue("newUser");
response.addCookie(cookie);
쿠키는 클라이언트에 저장되므로, 삭제하고 싶을 때는 유효기간을 0으로 설정해 다시 전송합니다.
Cookie cookie = new Cookie("userId", "");
cookie.setMaxAge(0); // 즉시 만료
response.addCookie(cookie);
5. 세션과 쿠키의 차이점 한눈에 비교
| 구분 | 세션(Session) | 쿠키(Cookie) |
|---|---|---|
| 저장 위치 | 서버(웹 컨테이너) | 클라이언트(웹 브라우저) |
| 식별 방법 | 세션 ID로 식별 | 쿠키 이름/값으로 식별 |
| 보안 | 상대적으로 안전 (서버 측 저장) | 브라우저에 노출, 탈취 위험 존재 |
| 용량 제한 | 서버 자원에 의존 | 쿠키 1개당 약 4KB, 브라우저별 개수 제한 |
| 유지 기준 | 비활성 시간(타임아웃) 또는 로그아웃 | 유효기간(Max-Age/Expires) 또는 브라우저 종료 |
| 주 사용 예 | 로그인 세션, 장바구니, 권한 정보 등 | 자동 로그인, 최근 본 상품, 개인정보 동의 여부 등 |
정리하자면, 보안이 중요한 상태 정보는 세션으로 관리하고, 사용성 향상을 위한 간단한 정보(자동 로그인 토큰, 최근 검색어 등)는 쿠키로 관리하는 패턴이 일반적입니다.
6. 자주 묻는 질문(FAQ)
Q1. 세션이 쿠키보다 항상 더 안전한가요?
세션은 서버에 정보를 저장하기 때문에 단순 쿠키보다 안전한 편이지만, 세션 ID 자체가 쿠키나 URL 등에 담겨서 오갈 수 있으므로 세션 탈취(Session Hijacking) 공격에 대비해야 합니다. HTTPS 사용, 세션 타임아웃 설정, 중요 작업 시 재인증 등의 보안 대책이 필요합니다.
Q2. 로그인 기능은 세션으로만 구현해야 하나요?
기본 로그인 상태는 세션으로 관리하는 것이 일반적입니다. 다만, “자동 로그인”이나 “로그인 상태 유지” 기능은 쿠키에 토큰 값을 저장한 뒤, 서버에서 해당 토큰을 검증하는 방식으로 구현하는 경우가 많습니다. 이때 토큰은 반드시 암호화·난수화해서 사용해야 합니다.
Q3. 브라우저를 닫으면 세션과 쿠키는 어떻게 되나요?
세션은 브라우저를 닫거나, 타임아웃 시간이 지나면 보통 무효화됩니다. 쿠키는 유효기간을 별도로 설정하지 않으면 세션 쿠키로 취급되어 브라우저를 종료할 때 삭제됩니다. 유효기간을 설정하면 브라우저를 꺼도 해당 시간까지 유지되는 영속 쿠키가 됩니다.
이 글을 통해 세션(Session)과 쿠키(Cookie)의 개념, 차이점, 사용 방법을 확실하게 정리해 두면, 이후 로그인/권한 관리/장바구니 같은 기능을 구현할 때 큰 도움이 될 것입니다.
댓글
댓글 쓰기