HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🛁
공부기록
/
🧑🏻‍💻
TIL
/
TIL - 34

TIL - 34

태그
Spring
Security
날짜
May 24, 2022
속성
 

Security

 
// 커스텀한 유저 서비스 등록하는 방법. @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userService); }
 

3-Tier 아키텍쳐

notion image
  • 가장 보편적이고 이해하기 쉬운 아키텍쳐이다.
    • 프레젠테이션 레이어 - 사용자와의 접점 제공
    • 애플리케이션 레이어 - 트랜잭션 처리를 위한 비즈니스 로직 제공
    • 데이터 레이어 - 데이터를 저자, 조회 기능 제공
  • 그 외의 장점들
    • 프론트, 백엔드 역할 분리에 따른 업무 효율화
    • 각 계층을 모듈화해서 다른 계층에 미치는 영향을 최소화하며 확장이 용이함
notion image

서비스 사용자가 매우 빠르게 증가하고 있는 상황에서 백엔드 개발자가 할 수 있는 일

  • 애플리 케이션의 레이어 서버를 수평 확장
  • 그리고 서비스 앞단에 로드 밸런서를 배치하여 트래픽을 분산시킨다.
  • 하지만 추가적으로 고려해야 하는 것 - 특정 서버에서 장애가 발생하면 어떤 일이 발생될지?
  • 서비스 가용 측면에서는 문제가 없다.
    • 하지만 사용자 인증 처리에서 세션을 사용하고, 그 외 특별한 조치가 없었다면?
      • 그 일부 사용자는 문제가 될 수 있다 !
    • 장애가 발생한 서버에서 인증된 사용자는 인증이 풀리게 되며 다시 인증을 해야하는 번거로움이 발생하게 된다.
 
notion image

HTTP와 Session

  • 근본적으로 HTTP는 무상태 프로토콜이다. 즉 어떤 정보도 저장하지 않음.
  • 서버는 인증된 사용자 정보를 저장하기 위해 세션이라는 것을 만들고 식별자인 세션아이디를 클라이언트로 응답한다.
    • 클라이언트가 웹 브라우저인 경우에 세션아이디는 보통 쿠키에 저장된다.
  • 클라이언트는 HTTP요청에 세션 아이디를 포함시켜 서버가 클라이언트를 식별할 수 있도록 해야한다.
  • 세션은 서버 메모리를 사용하기 때문에 너무 많아질 경우 서버 메모리 부족이 발생할 수 있다.
  • 서버 장애시 복제본이 없는 세션정보는 유실된다.
 
notion image

Sessin Cluster

  • 세션 기반 인증 처리의 문제점이 세션이 서버 메모리에 저장되는 것이라면 세션을 별도의 외부 스토리지에 저장한다는 개념이다.
  • 외부 스토리지는 조회 속도를 위해 보통 인메모리 데이터베이스를 많이 사용한다.
  • Sticky Connection(동일한 사용자가 발생시킨 요청은 동일한 WAS 에서 처리하지 않는다.)제약에서 자유롭다.
  • 특정 서버에 문제가 생겨도 다른 정상적인 서버에서 세션을 외부 스토리지에서 가져올 수 있으므로 사용자 인증이 풀리지 않는다.
 
💡
그래서 스프링은 Spring Session 을 지원한다.!
 

Spring Session의 핵심 - SessionRepository / SessionRepositoryFilter

 
  • SessionRepository
    • Session의 생성, 저장, 조회, 삭제 처리에 대한 책임을 가진다.
    • 스토리지 종류에 따라 다양한 구현체를 제공해준다.
      • MapSessionRepository - In-Memory Map기반이며 별도의 의존 라이브러리 필요없음
      • RediIndexdSessionRepositroy - redis 기반이며 @EnableRedisHttpSession애노테이션으로 생성됨
      • JdbcIndexedSessionRepository - jdbc 기반이며 @EnableJdbcHttpSession 애노테이션으로 생성된다.
  • SessionRepositoryFilter
    • 모든 HTTP요청에 대해 동작한다.
    • HTTPServletReuqest, Response 인터페이스 구현을 SessionRepositoryRequestWrapper, ResponseWrapper 구현체로 교체한다.
    • HttpServletRequest, Response 인터페이스의 세션 처리와 관련한 처리를 오버라이드 해야함.
      • 세션 관련 생성 및 입출력은 SessionRepository 인터페이스를 통해 처리함
      • HttpSession 인터페이스에 대해 Spring Session 구현체 HttpSessionWrapper 를 사용하도록함
      • HttpSessionWrapper 구현체는 org.springframework.session.Session 인터페이스를 포함하고 있다.
      • 스토리지 종류에 따라 구현체가 달라진다.
notion image