728x90
반응형
요약 한 줄
쿠키는 브라우저가 들고 다니는 작은 메모, 세션은 서버가 기억하고 쿠키(JSESSIONID)로 찾아오는 저장공간입니다. 로그인/장바구니는 보통 “세션”으로, “아이디 기억하기”는 “쿠키”로!
목차
- 쿠키 vs 세션 한눈 비교
- 쿠키: 브라우저가 저장하는 메모
- 세션: 서버가 관리하는 사용자 상태
- 로그인 흐름(쿠키·세션 조합) 실전 이해
- 보안 옵션(HttpOnly/Secure/SameSite) 핵심
- 서블릿/톰캣 기준 코드 예제
- 빈출 질문 & 실수 모음
- 체크리스트(면접/시험 대비)
1) 쿠키 vs 세션 한눈 비교
구분 쿠키(Cookie) 세션(Session)
| 저장 위치 | 클라이언트(브라우저) | 서버(메모리/세션 저장소) |
| 식별 방식 | Cookie 헤더로 키-값 전달 | JSESSIONID 쿠키로 세션을 조회 |
| 수명 | Max-Age/Expires로 지정(영구/단기) | 유휴 시간(예: 30분) 지나면 만료 |
| 용도 | 아이디 기억, 다크모드, A/B 실험 등 | 로그인 상태, 장바구니, 권한 정보 |
| 보안 | 탈취 위험 → HttpOnly/Secure/SameSite 필수 | 서버 보안 중심, 세션 고정 공격 주의 |
| 용량 | 도메인당 수 KB 수준 | 서버 자원 사용(사용자 수↑ = 메모리↑) |
포인트: “민감한 정보는 쿠키에 절대 직접 저장하지 말고, 세션에 저장하고 식별용 세션ID만 쿠키로!”
2) 쿠키: 브라우저가 저장하는 메모
- 구성: name=value; Path=/; Domain=.example.com; Max-Age=2592000; Secure; HttpOnly; SameSite=Lax
- 수명
- 세션 쿠키: 브라우저 종료 시 삭제(수명 미지정)
- 영속 쿠키: Max-Age/Expires 지정
- 도메인/경로: 전송 범위를 최소화하면 노출면을 줄여 보안↑
- 보안 옵션
- HttpOnly: JS로 접근 차단(XSS 완화)
- Secure: HTTPS에서만 전송
- SameSite: 크로스사이트 전송 제어(Lax 기본 추천, 제3자 필요 시 None; Secure)
3) 세션: 서버가 관리하는 사용자 상태
- 생성: 로그인 성공 → HttpSession에 사용자 정보를 저장
- 식별: 컨테이너가 발급한 랜덤한 세션ID를 쿠키(JSESSIONID)로 클라이언트에 심음
- 유지: 요청마다 JSESSIONID로 세션을 찾아서 상태를 이어감
- 만료: 유휴 시간 초과 or 명시적 invalidate()
- 확장: 서버 다중대응 시 스티키 세션 또는 외부 세션 저장소(예: Redis) 고려
4) 로그인 흐름(쿠키·세션 조합)
- 사용자가 로그인 폼 제출 → 서버에서 인증 성공
- HttpSession에 loginUser 저장, 세션ID 발급 → Set-Cookie: JSESSIONID=...
- 이후 요청에서 브라우저는 JSESSIONID를 자동 전송 → 서버는 해당 세션으로 사용자 식별
- “아이디 기억하기”는 별도 쿠키(rememberId)로 저장(민감정보 X)
5) 보안 옵션 핵심 정리
- 항상 HttpOnly + Secure(HTTPS 전제)
- SameSite=Lax 기본. 외부 리다이렉트/결제 등 크로스사이트 필요 시 SameSite=None; Secure
- 세션 고정 방지: 로그인 성공 시 세션 재발급(invalidate 후 새 세션)
- 쿠키 범위 최소화: Path, Domain 축소
- 민감정보(토큰·개인정보) 쿠키 값에 직접 저장 금지(서버 세션 or 안전 저장소 사용)
6) 서블릿/톰캣 기준 코드 예제
6-1. 세션 사용 (로그인 성공 시)
// 로그인 검증 이후
HttpSession session = req.getSession(); // 없으면 생성
session.setAttribute("loginUser", user); // 사용자 객체/ID 등
session.setMaxInactiveInterval(30 * 60); // 30분 비활성 시 만료
// 필요 시 세션 고정 방지: 새 세션 발급
session.invalidate();
HttpSession newSession = req.getSession(true);
newSession.setAttribute("loginUser", user);6-2. 로그아웃
HttpSession session = req.getSession(false); // 있으면 가져오고, 없으면 null
if (session != null) {
session.invalidate(); // 세션 파기
}
resp.sendRedirect("/"); // 홈으로
6-3. “아이디 기억하기” 쿠키
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import jakarta.servlet.http.Cookie;
// 로그인 폼에서 remember 체크 시
String userId = req.getParameter("userId");
Cookie remember = new Cookie("rememberId",
URLEncoder.encode(userId, StandardCharsets.UTF_8));
remember.setPath("/"); // 필요한 최소 경로
remember.setMaxAge(60 * 60 * 24 * 30);// 30일
remember.setHttpOnly(true); // JS 접근 차단
remember.setSecure(true); // HTTPS에서만
resp.addCookie(remember);6-4. SameSite 설정(서블릿 표준 속성 미지원 시 헤더로)
// Some containers still need manual header for SameSite
String cookie = "rememberId=" + URLEncoder.encode(userId, StandardCharsets.UTF_8)
+ "; Max-Age=2592000; Path=/; HttpOnly; Secure; SameSite=Lax";
resp.setHeader("Set-Cookie", cookie);6-5. 쿠키 읽기
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if ("rememberId".equals(c.getName())) {
String id = java.net.URLDecoder.decode(c.getValue(), StandardCharsets.UTF_8);
// 폼 기본값으로 채우기 등 활용
}
}
}7) 빈출 질문 & 실수 모음
- Q. 세션은 어디 저장되나요?
A. 기본은 서버 메모리(컨테이너). 규모가 커지면 외부 저장소/세션 클러스터링. - Q. 쿠키에 토큰/JWT 넣어도 되나요?
A. 가능하나 HttpOnly+Secure+SameSite를 지키고, 만료·회수 전략 및 XSS/CSRF 대비 필수. - Q. 로드밸런싱에서 세션이 사라져요!
A. 스티키 세션(같은 서버로 라우팅) 또는 공유 세션 저장소를 사용하세요. - 실수1: 쿠키에 개인정보/권한을 평문으로 저장
- 실수2: HttpOnly/Secure 빠짐
- 실수3: 로그인 시 세션 재발급 미흡(세션 고정 취약점)
- 실수4: SameSite 미설정으로 외부 연동 시 쿠키 전송 안 돼서 로그인 깨짐
8) 체크리스트(면접/시험 대비)
- 쿠키/세션 차이 10초 안에 설명 가능?
- JSESSIONID 역할 & 세션 재발급 타이밍 이해?
- HttpOnly/Secure/SameSite 각각의 의미/기본값/언제 쓰는지?
- 분산 환경에서 세션 유지 전략(스티키 vs 저장소) 장단점?
썸네일/타이틀 이미지
- 파일: session_cookie_title.png
- 컨셉: 쿠키 캐릭터가 “세션” 메모를 브라우저에게 전달하는 귀여운 낙서 스타일
- 티스토리 글 상단에 업로드 후 대표 이미지로 설정하세요.
728x90
반응형
'Computer Science > NetWork' 카테고리의 다른 글
| 📌"브라우저가 HTML을 어떻게 화면에 띄울까?" (1) | 2025.08.09 |
|---|---|
| 📌"브라우저가 URL을 입력하면 서버까지 무슨 일이 벌어질까 (3) | 2025.08.09 |
| 🧠 HTTP 상태코드 완전 정리하기 (재밌게, 쉽게, 한 방에!) (3) | 2025.08.04 |
| 🧩 RESTful API 제대로 알기: 개념부터 예제까지 한방에 정리! (2) | 2025.08.04 |
| ✅ 쿠키 vs 세션 vs 토큰 완벽 정리! 차이점과 웹 인증 구조 이해하기 (2) | 2025.08.02 |