목차
쿠키(Cookie)와 세션(Session)은 웹 개발에서 사용자 상태를 관리하는 핵심 기술입니다. 이 글에서는 쿠키와 세션의 주요 개념, 특징, 차이점, 원리, 실무에서의 활용 사례, 장단점, 그리고 주의사항을 자세히 다뤄보겠습니다. 초보자부터 실무 개발자까지 쉽게 이해할 수 있도록 구성했으니, 쿠키와 세션의 모든 것을 마스터하고 싶다면 끝까지 읽어보세요!
1. 쿠키와 세션이란? 주요 개념 및 용어
웹은 본질적으로 무상태(Stateless)이기 때문에, 사용자의 로그인 정보나 장바구니처럼 "상태 유지"가 필요한 기능에는 쿠키와 세션을 활용합니다.
쿠키의 정의
쿠키는 웹 서버가 사용자의 브라우저에 저장하는 작은 데이터 조각(최대 4KB)입니다. 주로 사용자 설정, 인증 정보, 방문 기록 등을 저장해 상태를 유지합니다.
세션의 정의
세션은 서버 측에서 사용자 데이터를 일시적으로 저장해 상태를 관리하는 방법입니다. 세션은 고유한 세션 ID를 통해 클라이언트와 서버 간의 연결을 유지합니다.
주요 용어
- 쿠키: 브라우저에 저장되는 키-값 쌍의 데이터.
- 세션 ID: 서버가 클라이언트를 식별하기 위해 발급하는 고유 식별자.
- HTTP 상태 비저장(Stateless): HTTP는 기본적으로 이전 요청의 상태를 기억하지 않음.
- 만료 시간: 쿠키 또는 세션 데이터가 유지되는 기간.
쿠키와 세션의 특징
- 쿠키:
- 클라이언트(브라우저) 측에 저장.
- 텍스트 기반, 최대 4KB.
- 브라우저 종료 후에도 유지 가능(만료 시간 설정 시).
- 세션:
- 서버 측에 저장(메모리, DB, 파일 등).
- 세션 ID는 쿠키 또는 URL로 전달.
- 서버 리소스 사용, 보안성 높음.
쿠키 vs 세션 차이점
항목 | 쿠키 | 세션 |
저장 위치 | 클라이언트(브라우저) | 서버 |
데이터 크기 | 최대 4KB | 서버 리소스에 따라 제한 없음 |
보안 | 노출 가능, 낮음 | 서버 저장, 높음 |
만료 | 설정 가능(영구/임시) | 주로 브라우저 종료 시 소멸, 기본 30분 (설정 가능) |
성능 | 서버 부하 적음 | 서버 리소스 사용 |
2. 쿠키와 세션의 원리와 구조
쿠키의 원리
- 서버는 응답 헤더에 Set-Cookie를 포함해 쿠키를 브라우저에 전송.
- 브라우저는 쿠키를 저장하고, 이후 요청 시 Cookie 헤더에 포함해 서버로 전송.
- 서버는 쿠키를 통해 사용자 상태(예: 로그인 정보)를 확인.
쿠키 HTTP 헤더 예시
// 서버 응답
HTTP/1.1 200 OK
Set-Cookie: user_id=12345; Max-Age=3600; HttpOnly
// 클라이언트 요청
GET /profile HTTP/1.1
Host: example.com
Cookie: user_id=12345
- 설명: 서버가 user_id 쿠키를 설정하고, 클라이언트는 이후 요청에 이를 포함. HttpOnly는 JavaScript 접근을 차단해 보안 강화.
세션의 원리
- 클라이언트가 서버에 접속 시, 서버는 고유한 세션 ID를 생성.
- 세션 ID는 쿠키(예: JSESSIONID) 또는 URL 파라미터로 클라이언트에 전달.
- 서버는 세션 ID를 키로 사용자 데이터를 서버(메모리, DB 등)에 저장.
- 클라이언트는 요청마다 세션 ID를 전송해 서버가 사용자 상태를 식별.
세션 동작 예시
1. 클라이언트: 서버에 로그인 요청
2. 서버: 세션 ID(JSESSIONID=abc123) 생성, 쿠키로 전송
3. 클라이언트: 이후 요청에 JSESSIONID=abc123 포함
4. 서버: 세션 ID로 사용자 데이터 조회
구조 비교
- 쿠키: 키=값 형태로 브라우저에 저장. 예: theme=dark; user_id=123.
- 세션: 서버에 데이터 저장, 클라이언트는 세션 ID만 전달. 예: 서버 메모리에 {abc123: {user_id: 123, name: "Alice"}}.
3. 실무에서 쿠키와 세션 활용 사례
쿠키와 세션은 Spring Framework와 같은 웹 프레임워크에서 사용자 인증, 상태 관리 등에 자주 사용됩니다.
3.1. Spring Boot에서 쿠키 사용
Spring Boot에서는 HttpServletResponse를 사용해 쿠키를 설정하고, HttpServletRequest로 쿠키를 읽습니다.
예시: 쿠키로 사용자 설정 저장
@RestController
public class CookieController {
@PostMapping("/set-theme")
public String setTheme(@RequestParam String theme, HttpServletResponse response) {
Cookie cookie = new Cookie("theme", theme);
cookie.setMaxAge(7 * 24 * 60 * 60); // 7일 유지
cookie.setPath("/");
cookie.setHttpOnly(true);
response.addCookie(cookie);
return "Theme set to: " + theme;
}
@GetMapping("/get-theme")
public String getTheme(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("theme".equals(cookie.getName())) {
return "Current theme: " + cookie.getValue();
}
}
}
return "No theme set";
}
}
- 설명: set-theme 엔드포인트는 사용자의 테마 설정을 쿠키로 저장. get-theme은 쿠키를 읽어 테마 반환. HttpOnly로 보안 강화.
3.2. Spring Boot에서 세션 사용
Spring은 HttpSession을 사용해 세션을 관리합니다.
예시: 세션으로 로그인 상태 관리
@RestController
public class SessionController {
@PostMapping("/login")
public String login(@RequestParam String username, HttpSession session) {
session.setAttribute("user", username);
session.setMaxInactiveInterval(30 * 60); // 30분 유지
return "Logged in as: " + username;
}
@GetMapping("/profile")
public String profile(HttpSession session) {
String username = (String) session.getAttribute("user");
if (username != null) {
return "Welcome, " + username;
}
return "Please log in";
}
@PostMapping("/logout")
public String logout(HttpSession session) {
session.invalidate();
return "Logged out";
}
}
- 설명: login은 세션에 사용자 이름을 저장. profile은 세션에서 사용자 정보를 조회. logout은 세션을 무효화. Spring은 기본적으로 JSESSIONID 쿠키로 세션 ID를 관리.
3.3. Spring Security와 세션
Spring Security는 세션을 활용해 인증 상태를 관리합니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/profile").authenticated()
.anyRequest().permitAll()
)
.formLogin(form -> form
.loginPage("/login")
.permitAll()
)
.logout(logout -> logout
.logoutUrl("/logout")
.invalidateHttpSession(true)
)
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.maximumSessions(1)
);
return http.build();
}
}
- 설명: Spring Security는 세션을 사용해 로그인 상태를 관리. maximumSessions(1)로 동일 사용자의 동시 로그인을 제한. invalidateHttpSession(true)로 로그아웃 시 세션 제거.
4. 쿠키와 세션의 장점과 단점
쿠키의 장단점
- 장점:
- 서버 부하 감소: 데이터가 클라이언트에 저장되므로 서버 리소스 절약.
- 영구 저장 가능: 만료 시간을 설정해 장기 데이터 유지.
- 간단한 구현: 키-값 쌍으로 쉽게 설정 및 조회.
- 단점:
- 보안 취약: 클라이언트에 저장되므로 위조/노출 위험.
- 크기 제한: 최대 4KB로 데이터 저장량 제한.
- 브라우저 의존: 쿠키 비활성화 시 동작 불가.
세션의 장단점
- 장점:
- 높은 보안성: 민감한 데이터가 서버에 저장.
- 유연한 데이터 관리: 크기 제한 없이 다양한 데이터 저장 가능.
- 사용자 추적: 세션 ID로 사용자별 상태 유지.
- 단점:
- 서버 부하: 세션 데이터 저장 및 관리로 서버 리소스 사용.
- 확장성 문제: 분산 시스템에서 세션 동기화 필요(Redis, DB 사용).
- 일시적: 브라우저 종료 시 세션 소멸(영구 저장 어려움).
주의사항
- 쿠키 보안: HttpOnly, Secure, SameSite 속성을 설정해 XSS, CSRF 방지.
- 세션 관리: 세션 만료 시간과 최대 세션 수를 적절히 설정.
- 분산 환경: Redis, Hazelcast 같은 세션 저장소로 세션 클러스터링.
- 데이터 최소화: 쿠키와 세션에 민감한 데이터 저장 지양.
- 브라우저 호환성: 쿠키 비활성화 시 대체 수단(URL 리라이팅 등) 고려.
5. 결론
언제 쿠키를, 언제 세션을 써야 할까?
- 간단한 사용자 식별 (예: 자동 로그인 ID 저장): 쿠키
- 로그인 상태, 장바구니, 사용자 권한 처리: 세션
- 보안이 중요하거나 사용자 정보가 많은 경우: 세션 우선
대부분의 실무에서는 쿠키 + 세션을 조합해서 사용합니다. 예를 들어, 세션 ID를 쿠키로 관리하여 서버에 사용자 상태를 안전하게 유지합니다.
쿠키와 세션은 웹 개발에서 사용자 상태를 관리하는 필수 기술입니다. 쿠키는 클라이언트 측에서 간단한 데이터를 저장하며 서버 부하를 줄이고, 세션은 서버 측에서 민감한 데이터를 안전하게 관리합니다. Spring Framework와 Spring Security에서 쿠키와 세션은 사용자 인증, 설정 저장 등에 광범위하게 활용됩니다. 그러나 보안, 성능, 확장성 측면에서 적절한 설정과 주의가 필요합니다.
이 글을 통해 쿠키와 세션의 차이부터 실무 활용까지 완벽히 이해하셨길 바랍니다. 쿠키와 세션을 적절히 활용해 안전하고 효율적인 웹 애플리케이션을 구축해 보세요!
'이직&취업 > Java 기초 상식' 카테고리의 다른 글
캡슐화(Encapsulation)가 무엇이며, 정보은닉(Information Hiding)과 어떻게 다르지? (22) | 2025.04.27 |
---|---|
Thread vs Runnable, 무엇을 언제 써야 할까? (19) | 2025.04.26 |
HTTP vs HTTPS, 도대체 뭐가 다른 걸까? – 보안과 성능까지 한 번에 이해하기! (33) | 2025.04.24 |
자바 개발자라면 반드시 알아야 할 람다식(Lambda Expression)의 모든 것! (43) | 2025.04.22 |
동시성(Concurrency) API 에 대해 알아보자!! (32) | 2025.04.19 |