현재 다담다 서비스에는 구글, 카카오톡 2가지 로그인을 사용하고 있다.
Spring Security에서 제공하는 Oauth 로그인 API를 이용해 로그인을 구현했는데, 원래는 잘 작동되는 것이 분산 서버를 구축하고 난 뒤 로그인이 되지 않는 이슈가 발생했다.
Spring Security는 기본적으로 세션과 쿠키를 가지고 동작된다.
서버가 분산 환경으로 바뀌면서 각 서버 메모리에서 갖고 있던 세션을 외부 공유 세션 저장소로 변경해야 한다.
외부 공유 세션의 종류는 이전 포스팅에 소개되어 있다.
https://godhkekf24.tistory.com/153
(우리 서버는 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 |