728x90

세션, 쿠키를 이용한 로그인을 구현하면서 다중서버의 경우 발생하는 세션 불일치문제를 해결하기 위한 세션 클러스터링을 구현하고 테스트한 소스코드를 정리한 포스팅입니다.


 

 

GitHub - N1ghtsky0/playground

Contribute to N1ghtsky0/playground development by creating an account on GitHub.

github.com


dependency(build.gradle)

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-data-redis'
	implementation 'org.springframework.boot:spring-boot-starter-mustache'
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.session:spring-session-data-redis'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.mysql:mysql-connector-j'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'
}

application.yml

spring:
  session:
    store-type: redis
  data:
    redis:
      host: docker-redis  #redis container name
      port: 6379
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://docker-mysql:3306/session_redis #mysql container name:mysql expose port
    username: root
    password: 1234
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
        show_sql: true
server:
  servlet:
    encoding:
      force: true

session 저장소로 레디스를 사용하기 위해서 별다른 설정은 없이 spring.session.store-type=redis로 설정해주면 autoconfigure가 자동으로 설정해준다.


SecurityConfig.java

@EnableWebSecurity
@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf(AbstractHttpConfigurer::disable)
                .cors(AbstractHttpConfigurer::disable)
                .authorizeHttpRequests(request -> request
                        .anyRequest().permitAll())
                .formLogin(config -> config
                        .loginPage("/login")
                        .usernameParameter("username")
                        .passwordParameter("password")
                        .defaultSuccessUrl("/"))
                .logout(config -> config
                        .logoutSuccessUrl("/")
                        .deleteCookies("JSESSIONID"));
        return http.build();
    }

 

간단한 프로젝트이기에 복잡한 설정 없이 csrf, cors 관련 기능을 모두 비활성화 해주고 로그인, 로그아웃 기능은 시큐리티에서 제공해주는 기능을 사용하였다.


컨트롤러, 엔티티 및 html등의 소스코드는 깃허브 참고바랍니다.

실행 방법은 readme.md 참고바랍니다.


결과

로그인 후 새로고침했을 때 다른 서버로 접속했지만 로그인이 유지되었음
redis에 세션이 정상적으로 저장되었음

+ Recent posts