프로그래머스 강의 듣기
: 가장 보편적이고 이해하기 쉬운 아키텍처
session-id
를 클라이언트로 응답session-id
를 포함시켜, 서버가 클라이언트를 식별할 수 있도록 해야함
: Session 기반 인증 처리의 문제점이 Session이 서버 메모리에 저장되는 것이라면, Session을 별도의 외부 스토리지에 저장한다는 개념
: Spring Session 프로젝트가 Spring Boot 웹앱에서 Session Cluster를 구현하는데 다양한 기능 제공
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
</dependency>
H2 운영 모드 변경 및 Spring Session 관련 테이블 초기화
datasource:
driver-class-name: org.h2.Driver
url: "jdbc:h2:file:./database/spring_security.db;MODE=MYSQL;DB_CLOSE_DELAY=-1"
username: sa
password:
hikari:
minimum-idle: 1
maximum-pool-size: 5
pool-name: H2_DB
sql:
init:
platform: h2
mode: always
schema-locations: classpath:sql/schema_new.sql, classpath:org/springframework/session/jdbc/schema-h2.sql
data-locations: classpath:sql/data_new.sql
encoding: UTF-8
datasource.url
수정 : jdbc:h2:file:./database/spring_security.db;MODE=MYSQL;DB_CLOSE_DELAY=-1
h2:mem
수정 : h2:file:파일경로.db
sql.init.mode
부분을 always
로 변경embedded (기본값)
이였으며, H2가 In-Memory 모드일 경우 해당됨embedded
에 해당하지 않으므로, 항상 초기화를 의미하는 always
로 변경이 필요함sql.init.schema-locations
부분에 spring-session-jdbc에서 사용하는 테이블 생성 SQL 쿼리 파일을 지정Spring Session 관련 설정
session:
store-type: jdbc
jdbc:
initialize-schema: never
session.store-type
부분에 jdbc 를 입력함
session.jdbc.initialize-schema
부분에 never
를 입력함
sql.init.schema-locations
부분에 spring-session-jdbc에서 사용하는 테이블 생성 SQL 쿼리 파일을 지정했기 때문에 사용하지 않음@EnableJdbcHttpSession
어노테이션을 추가하여, jdbc 기반 spring session을 활성화
org.springframework.session.SessionRepository
와 org.springframework.session.web.http.SessionRepositoryFilter
2개의 클래스는 Spring Session에서 가장 핵심적인 역할을 수행한다. 이들 클래스의 Bean 설정은 Spring Session Jdbc의 경우 JdbcHttpSessionConfiguration
클래스에서 처리sql.init.mode
를 never
로 변경하고 서비스를 시작 @EnableRedisHttpSession
어노테이션으로 생성됨@EnableJdbcHttpSession
어노테이션으로 생성됨HttpServletRequest
, HttpServletResponse
인터페이스 구현을 SessionRepositoryRequestWrapper,
SessionRepositoryResponseWrapper
구현체로 교체함HttpServletRequest
, HttpServletResponse
인터페이스의 Session 처리와 관련한 처리를 OverrideSessionRepository
인터페이스를 통해 처리함HttpSession
인터페이스에 대해 Spring Session 구현체 HttpSessionWrapper
를 사용하도록 함HttpSessionWrapper
구현체는 org.springframework.session.Session
인터페이스를 포함하고 있음org.springframework.session.Session
인터페이스 구현체가 달라짐SessionRepositoryFilter
클래스는 Spring Security의 DelegatingFilterProxy
보다 먼저 실행됨SecurityContextPersistenceFilter
는 SecurityContextRepository
인터페이스 구현체를 통해 사용자의 SecurityContext
를 가져오거나 갱신함HttpSessionSecurityContextRepository
클래스getSession()
메소드를 통해 Session을 가져옴HttpServletRequest
인터페이스의 스프링 세션 구현체인 SessionRepositoryRequestWrapper
클래스가 사용됨HttpSession
과의 투명한 통합(transparent integration)을 제공함 Reference
1. 프로그래머스 백엔드 데브코스
2. https://insightsoftware.com/logi-analytics/
3. https://cscie12.dce.harvard.edu/lecture_notes/2007-08/20080423/slide51.html
4. https://ignite.apache.org/use-cases/caching/web-session-clustering.html
5. https://docs.spring.io/spring-boot-data-geode-build/1.1.x/reference/html5/guides/caching-http-session.html