웹 개발 프로젝트 리뷰 (Web Design)

웹 개발 프로젝트 리뷰 (4) - 세션 (Session)

jay_the_code 2025. 6. 28. 15:00

지난번 JDBC와 PreparedStatement에 이어서
이번 글에서는 세션(Session)에 대해서
정리해보려고 합니다.

이번 프로젝트에서 세션 기능을 처음 사용하였는데
세션을 사용하는 것이 웹 페이지들 사이의 데이터 공유
데이터베이스 같은 다양한 기능들의 활용에 큰 도움이
되었고 웹 개발에서 사용하는 것이 필수적이라고
생각하였습니다.

세션 (Session)

웹에서는 기본적으로 사용자가 이전에 어떤 행동을
하였는지 서버는 알 수없습니다.

하지만 우리가 실제로 웹 서비스를 이용하다 보면
로그인이 유지되고 장바구니에 내가 담아둔 물건이
유지되는 등 사용자 상태 정보가 유지되는 것을
확인할 수 있습니다.

이렇게 사용자의 상태 정보를 유지하는 것을
도와주는 것이 바로 세션(Session)입니다.

세션의 장점으로는 클라이언트 쪽에 저장되는
쿠키(Cookie)와는 달리 서버 쪽에 저장되기 때문에
상대적으로 보안성이 좋습니다.

세션이 많이 활용되는 기능으로는 다음과
같은 기능들이 있습니다.

1. 로그인 상태 유지

2. 장바구니 정보 저장

3. 페이지 간 사용자 정보 공유

이외에도 더 다양한 활용법이 있지만
이번 프로젝트에서는 위 3가지 상황에서
세션을 활용하여 코드를 작성하였습니다.

특히 페이지간에 사용자 정보 공유
가능하게 하는 것이 세션의 장점이라고
생각합니다.

이번 프로젝트에서는 Java를 사용하여
웹 서버에서 실행되는 자바 클래스인 Servlet
컨트롤러의 역할로 활용하였습니다.

그래서 Servlet안에서 사용자 요청을 확인하고
응답하고 세션이 필요한 상황에서는 세션에 정보를
저장하는 방식으로 백앤드 로직을 작성하였습니다.

그럼 Servlet 내에서 어떤 방식으로 세션을
활용하였는지 정리해 보겠습니다.

1. 세션 객체 얻기

HttpSession session = request.getSession();

2. 세션에 데이터 저장하기

session.setAttribute("username", "James");

3. 세션에서 데이터 불러오기

String username = (String) session.getAttribute("username");

// 여기서 session.getAttribute()메소드의
// 반환타입이 Object타입이기 때문에
// "(String)" 처럼
// 항상 올바른 변수타입으로 캐스팅을 해줍니다.

4. 세션 삭제 (로그아웃할 때)

session.invalidate();

이번 프로젝트에서는 위와 같은 메소드들을
가장 많이 활용하였습니다.

하지만 저 메소드들 이외에도
getId() - 세션 고유 ID 반환
removeAttribute() - 특정 세션 데이터 삭제
setMaxInactiveInterval() - 세션 유지시간 설정
등과 같은 다양한 메소드들이 존재하므로
상황에 맞는 메소드를 사용하는 것이 중요하다고
생각합니다.

  보안적인 측면 (Security aspect)

쿠키와 비교해서 상대적으로 보안성이 높은
세션이지만 세션에서도 보안적으로 주의해야 할 일들이
있기 때문에 이에 대해서 조금 더 정리해보려고 합니다.

1. HTTPS 사용

요즘은 거의 모든 사이트들이 HTTPS를 사용하고
있긴 하지만 HTTPS를 사용하지 않으면 쿠키를 통해
전달되는 세션 ID가 탈취당할 가능성이 있습니다.

2. 세션 고정(Session Fixation) 방지

해커가 사용자의 세션 ID를 아래와 같이
미리 정해놓고 사용하게 만들 수 있습니다.
ex) https://blabla.com/login.jsp/jsessionid=abcd1234

해커가 abcd1234라는 세션 ID를 생성하고
이 세션 ID를 가진 URL을 전달하게 되면
기존 세션 ID를 통해 로그인을 유지하게 되므로
보안상 취약점이 생기게 됩니다.

아래와 같이 로그인을 할 때 반드시 새로운 세션이
생성되게 하여서 이를 방지할 수 있습니다.

session.invalidate(); // 기존 세션 삭제
HttpSession newSession = request.getSession(true); // 새 세션 생성
newSession.setAttribute("username", "James");

3. 세션 타임아웃 설정

일정한 시간 동안 사용자의 활동이 없으면
자동으로 세션이 종료되게 설정할 수 있습니다.

session.setMaxInactiveInterval(1800);
// 1800s = 30mins

 4. 로그아웃시 세션 삭제

// 로그아웃시 세션을 삭제
session.invalidate();

기본적으로 위와 같은 방법들을 활용하여
보안성을 높일 수 있습니다.

이외에도 HttpOnly, Secure를 사용하여 쿠키 쪽
보안을 강화하거나 세션을 생성한 환경과 요청 환경이
동일한지 검증하는 등 더 다양한 방법으로
세션의 보안성을 높이는 것이 가능합니다!   

마지막으로 너무 많은 데이터를 세션에 저장하면
서버 메모리를 과도하게 사용할 수 있으므로
필요한 데이터만 저장하여
사용하는 것이 좋습니다.

세션은 사용자 맞춤형 서비스를 제공하고
사용자 상태 정보 유지하는데 필수적인 요소입니다.

이번 프로젝트를 계기로 세션의 개념과 흐름을
잘 이해하여 코드를 작성하면 보안성 높은
사용자 경험을 제공할 수 있다는 것을
깨달았습니다.