[SpringBoot] Session이란

hun·2023년 9월 20일

SpringBoot

목록 보기
7/8

허용된 클라이언트들에 한하여 결제 시스템을 개발할때 정보 위조 방지를 위하여 session을 사용하여 데이터를 저장했다 하지만 쉽게 개발이 끝나는 법은 없었다.

Spring-Security 환경에서 Session 이용시, getAttribute을 사용하여 데이터 불러오는데 실패하기도 했고, 배포했는데 직/역렬화 에러 로그가 계속 나오기도 했다.

session에 대한 정확한 동작원리를 알지 못한 채 사용하다보니 문제가 생겼을때 유연하게 대처하지 못해 다음엔 이런일이 없기위해 알아보려고 한다.

  1. session을 쓰는 이유
    HTTP특징 중 하나로는 Stateless(상태를 유지하지 않는 프로토콜) 이기 때문에 커넥션이 끊어지는 순간 요청했던 정보를 유지하지 않기 때문에 중복 데이터 및 중요 데이터를 서버에 보관해 편리함과 보안성을 높이기 위해 쓰기로 했다.

  2. session 생성
    Tomcat(서블릿 컨테이너)에서 Filter, Servlet 등 Request 객체의 getSession() 메소드를 최초로 호출하는 순간 생성이 된다.
    Spring은 Tomcat이 만든 HttpSession을 주입할 뿐, HttpSession을 생성하는 주체는 Tomcat이다.

    그 후 Set-cookie를 통하여 클라이언트에 응답을 하게 되고 생성된 session을 요청할때 실어보내 서버에서 데이터를 가져오게 된다.

  3. session 한계
    실제 서버에 배포하게 된다면 로드 밸런싱을 위해 최소2개의 서버에 배포하게 될것이다.

    A서버에 최초요청 후 session 생성이 되었는데, B서버에 A서버에서 발급받은 session을 보낸다면 B서버는 제대로 된 응답을 하지 못할것이다.
    해결할 방법은 여러가지 방법이 있지만 내가 사용한 방법은 인메모리DB(Redis)를 세션저장소로 이용(세션 클러스터링)했다.


  4. Spring-Session 필터 이용
    Spring Session은 사용자의 세션 정보를 관리하기 위해 API 및 구현체를 제공한다.
    Spring Boot 설정에서는 springSessionRepositoryFilter라는 이름의 Filter 인터페이스를 구현한 빈을 생성한다.
    Tomcat 모든 요청에 대해 springSessionRepositoryFilter를 사용하도록 설정해야 하지만 이 과정은 Spring Boot가 이러한 단계를 자동으로 처리해줌.

    Session 정보를 가져올 수 있도록 Request 객체를 Warpping 하고, Session 객체를 SessionRepository 를 이용해서 저장하는 일을 한다
    SessionRepository는 객체로 만들어진 Session을 어딘가에 저장하는 기능을 제공하기 위한 인터페이스인데 Redis를 이용해서 저장하하므로 spring-session-redis 의존성을 같이 추가하는 것이다.

결국 공부하면서 알게 된 것은 Tomcat Filter대신에 Spring Filter를 이용하여 먼저 점령하게 되고, 생성된 session을 redis에 저장하게 된다는 것이다. 이렇게 되면 Tomcat은 session을 안하게 되는것을 알게 되었다.

spring-session에 대해서 몰랐던 사실을 알게 되어 다음에 사용하게 될때, 유용하게 활용하여 더 나은 코드를 작성해야겠다.

[참조]
https://thecodinglog.github.io/spring-session/2020/08/07/filter-chain.html
https://zuminternet.github.io/spring-session/

profile
짧더라도 확실한 기록

0개의 댓글