정기간행물/daily

분산 서버 구축 이후 로그인 이슈 (다담다)

:)jun 2023. 10. 15. 13:00

https://dadamda.me 

 

세상의 모든 URL, 다담다

내용에 따라 자동으로 북마크를 구성하는 신개념 컨텐츠 맞춤 스크랩 서비스, 다담다

dadamda.me

현재 다담다 서비스에는 구글, 카카오톡 2가지 로그인을 사용하고 있다.

Spring Security에서 제공하는 Oauth 로그인 API를 이용해 로그인을 구현했는데, 원래는 잘 작동되는 것이 분산 서버를 구축하고 난 뒤 로그인이 되지 않는 이슈가 발생했다.

 

Spring Security는 기본적으로 세션과 쿠키를 가지고 동작된다.

서버가 분산 환경으로 바뀌면서 각 서버 메모리에서 갖고 있던 세션을 외부 공유 세션 저장소로 변경해야 한다.

외부 공유 세션의 종류는 이전 포스팅에 소개되어 있다.

 

https://godhkekf24.tistory.com/153

 

Spring Session

Spring Session은 사용자의 세션 정보를 관리하기 위해 제공된다. - HttpSession: RESTful API에 작동하도록 헤더에 세션 ID를 제공하는 것을 통해 어플리케이션 컨테이너 중립적인 방식으로 대체할 수 있다

godhkekf24.tistory.com

(우리 서버는 JWT 토큰을 사용해 로그인을 구현했는데 왜 세션에 관련한 이슈가 발생했는지는 더 확인해봐야 할 것 같다.)

 

우리 서비스의 아키텍처는 AWS 서비스를 이용해 구현했기 때문에 공유 세션 저장소로 Elastic cache(redis)를 사용하기로 결정했다.

로그인시에만 잠시 사용할 것이기 때문에 최저 사양으로 구성했고, 샤드 1개, 노드 1개로 단순 구축해서 API 서버와 연결했다.

 

의존성 추가 (gradle)

    // redis
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    implementation 'org.springframework.session:spring-session-data-redis:2.6.1'

application.yml 설정 추가

  # Redis 설정
  redis:
    host: **********.apn2.cache.amazonaws.com
    port: 6379
  session:
    store-type: redis
    redis:
      namespace: spring:session

 

RedisConfig.java 설정 추가

@Configuration
@ConditionalOnProperty(value = "spring.session.store-type", matchIfMissing = true, havingValue = "redis")
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 10)
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(host, port);
    }

    @Bean
    ConfigureRedisAction configureRedisAction() {
        return ConfigureRedisAction.NO_OP;
    }
}

 

이후 모든 서버들에 재배포해주면 모든 서버의 공유 세션 저장소가 AWS Elastic cache(redis)로 설정되고 로그인도 정상적으로 작동하는 것을 확인해볼 수 있다.

 

더 공부해봐야 할 것

1. redis를 cluster mode로 생성하면 해당 이슈가 해결되지 않는 것을 확인할 수 있었다. cluster mode일 때와 아닐 때의 차이를 확인해보고 추후 포스팅 하겠다.

2. 우리 서비스는 JWT를 사용하기 때문에 Spring Security에서도 쿠키를 사용해서 작동될텐데 해당 문제가 생긴 이유를 우리 코드와 Spirng Security docs를 통해 확인해봐야겠다.

'정기간행물 > daily' 카테고리의 다른 글

blob? Formdata? MultipartFile? (다담다)  (0) 2023.10.19
모던 자바 인 액션 시작  (0) 2023.10.18
Spring Session  (0) 2023.10.14
보드 공유 URL 설계 (다담다)  (0) 2023.10.13
한빛N MSA - #5 Re-Search  (1) 2023.10.12