쿠키(Cookie)와 세션(Session)의 차이점은 무엇인가요?
쿠키(Cookie)
쿠키는 사용자의 브라우저에 저장되는 작은 데이터 조각. HTTP는 상태를 저장하지 않는 Stateless 프로토콜이므로, 서버는 클라이언트의 상태를 기억하지 못합니다. 이를 보완하기 위해 쿠키를 사용합니다. 서버가 클라이어늩에게 정보를 기억하기 위해 생성하며 브라우저가 이를 저장하고 요청마다 다시 서버에 전송합니다.
특징
- 사용자의 브라우저에 저장
- 보통 쿠키의 크기는 4KB로 제한
- 쿠키는 만료 시간이 설정되어 있어 이 시간 이후에 브라우저에서 자동으로 삭제. Session Cookie의 경우는 브라우저를 닫으면 삭제되며 Persistent Cookie는 만료 시간까지 유지.
- 사용자가 브라우저 설정에서 직접 쿠키를 확인하고 삭제할 수 있음.
- 쿠키는 클라이언트 측에 저장되므로 탈취나 변조 위험이 있음.
동작 과정
사용자가 웹사이트에 처음 접속하면 서버가 쿠키를 생성 -> 서버는 HTTP 응답 헤더에 쿠키를 담아 클라이언트로 전송 -> 클라이언트(브라우저)는 쿠키를 저장. -> 이후 동일한 도메인에 요청할 때, 브라우저는 쿠키를 HTTP 요청 헤더에 포함시켜 서버에 전송.
Session
세션은 서버 측에서 사용자별로 정보를 유지하기 위해 사용하는 기술. 사용자가 웹사이트에 접속한 동안 특정 정보를 서버 메모리나 데이터베이스에 저장하여 상태를 유지. 세션은 서버가 고유 식별자(Session ID)를 부여하고 클라이언트와 서버 간의 상호작용을 기반으로 작동
특징
- 서버 측에 저장
- 세션 크기는 서버의 메모리나 데이터베이스 용량에 따라 결정.
- 서버에서 세션의 유효 시간을 설정할 수 있음. 보통 일정 시간이 지나면 자동으로 만료됨.
- 세션은 서버에 저장되므로 쿠키에 비해 상대적으로 안전하지만 세션 ID를 탈취 당하면 위험하므로 HTTPS를 사용해야 한다.
동작 과정
사용자가 웹사이트에 접속하면 서버는 고유한 세션 ID를 생성 -> 서버는 이 세션 ID를 클라이언트에 전달하며 클라이언트는 보통 쿠키를 이용해 세션 ID를 저장. -> 사용자가 다음 요청을 보낼 때 세션 ID를 포함하여 서버에 전달. -> 서버는 전달받은 세션 ID를 사용하여 클라이언트와 연결된 데이터를 조회.
언제 쿠키를 사용? 언제 세션을 사용?
쿠키 : 사용자 정보가 민감하지 않고 브라우저에 저장해도 문제가 없는 경우
ex) 자동 로그인, 사용자 설정(테마, 언어 등)
세션 : 사용자 정보를 서버에서 안전하게 관리해야 하는 경우
ex) 로그인 상태 유지, 장바구니 정보 저장
보안 고려 사항
쿠키 보안 강화
- Secure : HTTPS에서만 쿠키 전송
- HttpOnly : JavaScript를 통한 쿠키 접근 차단
- SameSite : 크로스 사이트 요청 방지
세션 보안 강화
- HTTPS 사용
- 세션 ID 탈취 방지를 위한 정기적 재발급
- 서버에서 세션 만료 시간 설정
쿠키(Cookie)와 세션(Session)의 개념을 이해한 후, Java 및 Spring 백엔드 개발자로서 실습할 수 있는 여러 흥미로운 주제와 과제가 있습니다. 쿠키와 세션은 웹 애플리케이션 개발에서 중요한 기술이므로, 실습을 통해 이를 다뤄보는 것이 실무에 큰 도움이 됩니다.
1. 기본 실습: 쿠키와 세션의 동작 이해하기
1.1 쿠키 실습
-
목표: 클라이언트 브라우저에 쿠키를 저장하고, 이를 서버에서 읽어 처리해보기.
-
작업
- Servlet/JSP
HttpServletResponse를 사용해 쿠키를 생성하고 클라이언트에 저장.
HttpServletRequest를 사용해 저장된 쿠키를 읽고 화면에 표시.
- Spring
ResponseEntity를 사용해 쿠키를 설정.
HttpServletRequest로 클라이언트가 보낸 쿠키를 확인하고 반환.
-
예제
Cookie cookie = new Cookie("user", "JohnDoe");
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
System.out.println(c.getName() + "=" + c.getValue());
}
}
1.2 세션 실습
-
목표: 서버에서 세션을 생성하고 유지, 만료하는 방법 익히기.
-
작업
- Servlet/JSP
HttpSession 객체를 이용해 세션 생성.
- 세션에 데이터를 저장하고 읽기.
- Spring
@SessionAttributes와 HttpSession을 활용해 세션 데이터를 관리.
-
예제
HttpSession session = request.getSession();
session.setAttribute("user", "JohnDoe");
String user = (String) session.getAttribute("user");
System.out.println("User: " + user);
session.invalidate();
2. 응용 실습: 로그인 상태 유지
2.1 쿠키를 이용한 로그인 상태 유지
- 사용자 로그인 시 사용자 이름을 쿠키에 저장.
- 클라이언트가 사이트를 방문할 때 쿠키를 읽어 로그인 상태를 유지.
- 과제: 사용자가 로그아웃하면 쿠키를 삭제하도록 구현.
2.2 세션을 이용한 로그인 상태 유지
- 사용자 로그인 시 세션에 사용자 정보를 저장.
- 요청마다 세션을 확인해 로그인 여부를 체크.
- 과제: 세션이 만료되었을 때 사용자에게 로그인 페이지로 리다이렉트.
3. Spring Boot 기반 실습
3.1 쿠키와 세션 활용
- 목표: Spring Boot에서 쿠키와 세션을 활용한 상태 관리 구현.
- 작업
- 쿠키에 사용자 테마 정보(예: 다크모드 여부) 저장.
- 세션에 사용자 장바구니 정보 저장.
@SessionAttributes와 Model 객체를 활용해 세션 데이터 관리.
4. 보안 실습
4.1 쿠키 보안 설정
- Secure, HttpOnly, SameSite 속성을 설정해 보안 강화.
- HTTPS 환경에서 쿠키 동작 테스트.
4.2 세션 보안 설정
- 세션 고정 공격(Session Fixation Attack)을 방지하기 위해 로그인 시 세션 ID를 재발급.
- 세션 만료 시간 설정 및 재로그인 시 처리 로직 구현.
5. 실전 프로젝트
5.1 간단한 로그인 시스템 구현
- 쿠키: 자동 로그인 기능 구현.
- 브라우저에
remember-me 쿠키를 저장하고, 다음 방문 시 서버에서 확인.
- 세션: 사용자별 로그인 상태 유지.
- 로그인 성공 시 세션에 사용자 정보를 저장.
- 로그아웃 시 세션을 무효화.
5.2 장바구니 기능 구현
- 세션 활용: 사용자가 선택한 상품을 세션에 저장하고, 이를 장바구니 페이지에서 출력.
- 과제: 세션 데이터가 만료되었을 때 경고 메시지 표시.
5.3 사용자 환경 설정 저장
- 쿠키 활용: 다크 모드, 언어 설정 등을 쿠키에 저장.
- Spring Boot 예제:
- 사용자가 선택한 테마를 쿠키에 저장하고, 이를 읽어 브라우저에서 적용.
6. 추가 학습과 확장
6.1 JWT와 비교
- JWT(JSON Web Token)를 학습하고, 세션 기반 인증과의 차이점 비교.
- Spring Security에서 JWT를 사용하는 방법 실습.
6.2 Redis와 세션 통합
- 세션을 메모리 기반 데이터베이스인 Redis와 통합하여 성능 개선.
- 과제: Redis를 사용해 다중 서버 환경에서도 세션 데이터 유지.
실습 환경 준비
이 실습을 통해 쿠키와 세션의 동작 원리를 이해하고, 실제 애플리케이션에서 이를 효과적으로 활용할 수 있는 능력을 키울 수 있습니다. 😊