
세션 기반 로그인이란?
세션(Session) 기반 로그인은 사용자가 로그인하면 서버가 고유한 세션 ID를 생성하고, 해당 ID를 클라이언트(브라우저)에 전달해서 사용자의 로그인 상태를 유지하는 방식이다.
동작 방식
1. 로그인 요청
→ 사용자 ID/PW 전송
2. 서버에서 인증 확인
→ 세션 생성 (세션 ID 발급)
3. 세션 ID를 쿠키에 담아 응답
→ 클라이언트는 쿠키에 세션 ID 저장
4. 이후 요청 시 쿠키의 세션 ID 자동 전송
→ 서버는 세션 저장소에서 사용자 정보 조회 → 로그인 유지
세션 저장소와 관리 방식
1. 메모리 기반
- 기본적인 방식. 서버 메모리에 세션 저장
- 재시작 시 세션 초기화됨
2. 외부 저장소
- DB, Redis 등 외부 저장소에 세션 정보 저장
- 서버 간 세션 공유 가능 (분산 환경에서 유리)
장점과 단점
장점
1. 보안성
세션 기반 로그인의 가장 큰 장점은 사용자 인증 정보가 클라이언트가 아닌 서버에 저장된다는 점이다. 클라이언트에는 오직 세션 ID만 전달되고, 실제 중요한 정보는 서버에 있기 때문에 직접적인 노출 위험이 적어 보안성이 높다.
2. 사용자 상태 관리에 용이
세션은 서버가 사용자의 상태를 기억할 수 있게 한다. 예를 들어 로그인 상태, 장바구니 정보, 권한 같은 사용자 맞춤형 데이터를 서버에서 유지할 수 있어서, 복잡한 웹 서비스에 적합하다.
3. 구현이 간단함
Spring이나 Django 같은 프레임워크에서는 세션 처리가 이미 내장되어 있어서, 따로 복잡한 암호화나 토큰 발급 과정을 만들지 않아도 간단한 코드로 로그인 기능을 구현할 수 있다.
4. 세션 제어가 유연함
세션은 서버가 직접 관리하기 때문에, 로그아웃 시 세션을 즉시 종료하거나, 일정 시간 비활성화되면 자동으로 만료되게 하는 등의 정밀한 제어가 가능하다.
5. 서버 기반 확장 가능
Redis나 데이터베이스 같은 외부 저장소를 연동하면, 서버가 여러 대로 구성된 분산 환경에서도 세션을 공유할 수 있어서 확장도 가능하다.
단점
1. 확장성 문제
세션은 서버가 상태를 저장하기 때문에, 무상태(stateless) 구조를 기반으로 하는 REST API나 마이크로서비스 아키텍처와는 잘 맞지 않다. 서버가 늘어나면 세션 정보를 각 서버 간에 공유하거나 동기화해야 하는 부담이 생긴다.
2. 서버 리소스 사용
모든 사용자의 로그인 상태를 서버가 기억해야 하므로, 사용자 수가 많아질수록 세션 저장소에 메모리나 스토리지 부담이 커지고, 서버 성능에 영향을 줄 수 있다.
3. 분산 서버에서 복잡함
서버가 여러 대일 경우, 어떤 서버에 접속하든 동일한 세션을 유지하려면 세션 공유나 Sticky Session 설정, Redis 같은 외부 저장소 연동이 필요하다. 구현이나 유지보수 측면에서 번거로워질 수 있다.
4. 세션 ID 탈취 위험
클라이언트가 갖고 있는 세션 ID가 유출되면, 공격자가 해당 세션을 탈취해서 사용자를 가장할 수 있다. 그래서 세션 기반 로그인에서도 HTTPS, 쿠키 보안 설정, CSRF 방지 등의 추가적인 보안 조치가 꼭 필요하다.
5. 서버 재시작 시 세션 손실 가능
기본 메모리 기반 세션은 서버가 재시작되면 모두 날아간다. 이럴 경우 사용자는 강제로 로그아웃되며 다시 로그인해야 한다, 지속적인 세션 유지를 위해서는 외부 저장소 연동이 필수이다.
Spring MVC에서 세션 로그인 구현 예시
로그인 처리
@PostMapping("/login")
public String login(@RequestParam String username,
@RequestParam String password,
HttpSession session) {
User user = userService.login(username, password);
if (user != null) {
session.setAttribute("loginUser", user);
return "redirect:/home";
} else {
return "redirect:/login?error=true";
}
}
로그아웃 처리
@GetMapping("/logout")
public String logout(HttpSession session) {
session.invalidate(); // 세션 삭제
return "redirect:/login";
}
세션 로그인 유지 확인
@GetMapping("/home")
public String home(HttpSession session, Model model) {
User user = (User) session.getAttribute("loginUser");
if (user == null) {
return "redirect:/login";
}
model.addAttribute("user", user);
return "home";
}
'백엔드' 카테고리의 다른 글
| [개념] JWT(JSON Web Token)에 대해 (2) | 2025.07.07 |
|---|---|
| [개념] 인증(Authentication) vs 인가(Authorization) (4) | 2025.05.15 |
| [개념] 소프트웨어 디자인 패턴과 MVC 패턴 (1) | 2025.04.04 |