[Spring] 로그인 처리1 (쿠키, 세션) 정리
2025. 3. 31. 06:32ㆍ코딩 도구/백엔드 개발 (Backend Development)
반응형
스프링 MVC 2 - 로그인 처리1: 쿠키, 세션 정리
이 글은 인프런 김영한님의 "스프링 MVC 2편 - 백엔드 웹 개발 활용 기술" 강의의 '로그인 처리1 - 쿠키, 세션' 파트를 수강하고 정리한 내용입니다.
웹 애플리케이션에서 로그인 기능은 사용자 인증의 핵심이다. 이 강의에서는 쿠키와 세션을 활용하여 로그인 상태를 유지하는 다양한 방법을 학습한다. 먼저 쿠키 기반의 로그인부터 시작해서, 직접 만든 세션 매니저를 구현하고, 마지막에는 서블릿이 제공하는 HttpSession 기능까지 활용하여 보안과 유지보수성을 높이는 방향으로 발전시킨다.
정리 및 흐름 요약
- 홈 화면: 로그인 전/후 상태 구분
- 회원 가입, 로그인 폼 구현
- 로그인 처리 (1단계: 쿠키 기반)
- 쿠키의 보안 이슈 분석
- 로그인 처리 (2단계: 직접 만든 세션)
- 로그인 처리 (3단계: HttpSession 사용)
- 세션과 타임아웃 설정
1. 로그인 요구사항
- 로그인 성공 시 사용자 이름과 함께 홈 화면에 표시
- 상품 관리 메뉴는 로그인한 사용자에게만 노출
- 로그인하지 않은 사용자가 상품 관리 접근 시 로그인 페이지로 이동
2. 쿠키 기반 로그인 처리
핵심 아이디어
- 로그인 성공 시 쿠키에 사용자 ID를 저장하고, 이후 요청마다 쿠키 값을 통해 사용자 인증 여부 확인
Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
response.addCookie(idCookie);
- 홈 컨트롤러에서 @CookieValue를 통해 쿠키 값 조회 후 사용자 확인
문제점
- 보안 취약점 심각
- 쿠키는 사용자 브라우저에서 수정 가능 → 다른 사용자로 가장 가능
- 네트워크 전송 시 도난 가능 → 정보 노출 위험
3. 직접 만든 세션 처리
SessionManager 구현
- UUID로 추정 불가능한 세션 ID 생성
- ConcurrentHashMap에 세션 ID와 사용자 정보를 저장
- 클라이언트에는 세션 ID만 쿠키로 전달
public void createSession(Object value, HttpServletResponse response) {
String sessionId = UUID.randomUUID().toString();
sessionStore.put(sessionId, value);
Cookie cookie = new Cookie("mySessionId", sessionId);
response.addCookie(cookie);
}
- 세션 만료도 쿠키와 맵에서 제거하는 방식으로 구현
장점
- 사용자 정보는 서버에서만 보관
- 쿠키에는 식별값만 포함되어 보안 강화
4. 서블릿 HttpSession 활용
HttpSession
- 서블릿이 제공하는 세션 기능
- 로그인 시 HttpSession을 통해 사용자 정보 저장
HttpSession session = request.getSession();
session.setAttribute("loginMember", loginMember);
- 로그아웃 시 session.invalidate() 호출로 세션 제거
장점
- 세션 만료 시간 설정, 자동 관리
- JSESSIONID를 기반으로 안정적으로 로그인 상태 유지
@PostMapping("/logout")
public String logout(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session != null) session.invalidate();
return "redirect:/";
}
스프링 편의 기능: @SessionAttribute
- 세션에서 특정 속성만 간단히 꺼낼 수 있음
@SessionAttribute(name = "loginMember", required = false) Member loginMember
5. 세션 정보와 타임아웃 설정
- 세션 생성 시간, 마지막 접근 시간 등 정보 조회 가능
- 기본 타임아웃: 30분 (1800초)
session.getMaxInactiveInterval(); // 설정된 타임아웃 시간
session.getLastAccessedTime(); // 최근 접근 시간
설정 방법
- 글로벌 설정 (application.properties)
server.servlet.session.timeout=30m
- 개별 설정
session.setMaxInactiveInterval(1800); // 30분
6. 보안 주의사항 정리
쿠키 위조 | 브라우저에서 쿠키 값 수정 가능 |
쿠키 탈취 | 중간자 공격 등으로 유출 가능 |
쿠키 도용 | 탈취한 쿠키로 로그인 유지 가능 |
해결 방안
- 사용자 정보는 서버에 저장 (세션)
- 클라이언트에는 추정 불가한 토큰만 저장
- 세션 ID는 UUID로 구성, 타임아웃을 짧게 유지
마무리 정리
- 쿠키 기반 로그인은 구현은 쉬우나 보안이 취약함
- 세션은 보안을 보완할 수 있는 서버 중심의 안정적인 로그인 관리 방법
- 직접 구현한 세션 → HttpSession → @SessionAttribute 순으로 점진적 개선
- 스프링의 HttpSession 기능을 적극 활용하면 편의성과 안정성 모두 확보할 수 있다
반응형
'코딩 도구 > 백엔드 개발 (Backend Development)' 카테고리의 다른 글
[Spring] 검증2 (Bean Validation) 정리 (0) | 2025.03.25 |
---|---|
[Spring] 검증(Validation) 정리 (0) | 2025.03.21 |
[Spring] 개발 역할, 부트스트랩, PRG 패턴 (1) | 2025.03.14 |
[Spring] 스프링 MVC 기본 기능 정리 (1) | 2025.03.07 |
MVC 패턴: 서블릿과 JSP의 한계를 넘어 (1) | 2025.03.01 |