Redis 로컬 설치
curl -fsSL <https://packages.redis.io/gpg> | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] <https://packages.redis.io/deb> $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis
sudo service redis-server start
local 에서 실행
- redis 접속
redis-cli
- redis 실시간 모니터링
redis-cli MONITOR
maven 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
applocation 수정
spring:
redis:
host: localhost
port: 6379
EnableRedisHttpSession 수정
@EnableRedisHttpSession
@SpringBootApplication
public class LucyApplication {
public static void main(String[] args) {
SpringApplication.run(LucyApplication.class, args);
}
}
Serializable
Redis 에서 관리되는 객체는 Serializable (직렬화) 기능을 상속 받아야합니다.
* 아래 코드 기준으로 Company 객체도 상속 받아야합니다.
@Data
public class AuthUser implements Serializable {
private Long id;
private Company company;
private String email;
}
* 상속 안받으면 아래와 같은 에러가 발생합니다.
org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.InvalidClassException: com.rsn.lucy.common.dto.AuthUser; class invalid for deserialization
여기까지 진행하면 Spring 의 세션 스토리지를 Redis 로 관리하는 설정은 끝난것입니다.
JSESSIONID
저희 프로젝트는 Cookies 에 JSESSIONID 를 받아서 인증이 되었다는 것을 증명하는 구조입니다.
Redis 연결 하기 전에는 JESEEIONID 로 잘 되었는데 연결 후에는 SESSION 으로 쿠키가 넘어오는 이슈가 발생했습니다.
applocation 파일에 name 추가
server:
servlet:
session:
cookie:
secure: true
same-site: none
http-only: true
name: JSESSIONID
domain: xxx.com
JESEEIONID 로 쿠키가 잘 생성되었으나 DevToools 의 application 에서는 확인할 수 없습니다.
이유는 일반적으로 브라우저의 쿠키는 동일 출처 정책(Same Origin Policy)에 따라 동일한 도메인, 서브도메인 및 포트에서만 공유됩니다. 이 정책은 보안을 강화하고, 다른 도메인으로부터의 쿠키 접근을 제한하기 위해 존재합니다.
따라서 프론트엔드와 백엔드 도메인이 다른 경우, 기본적으로 브라우저는 쿠키를 전송하지 않을 것입니다. 서브도메인만 일치하는 경우에도 이 동일 출처 정책이 적용됩니다.
그러나 쿠키를 서브도메인 간에 공유하려면 다음과 같은 방법을 고려할 수 있습니다:
- CORS 설정
- 백엔드 서버에서 CORS (Cross-Origin Resource Sharing) 정책을 구성하여 프론트엔드 도메인에서의 요청을 허용합니다. 이를 통해 프론트엔드와 백엔드 간의 통신이 허용되고, 쿠키도 공유될 수 있습니다.
- 도메인 설정
- 프론트엔드와 백엔드의 도메인을 가능한 한 서브도메인까지 일치시키는 것이 좋습니다. 이렇게 하면 브라우저에서 쿠키를 서브도메인 간에 공유할 수 있습니다.
- 프록시 서버
- 프론트엔드와 백엔드 간의 통신을 중계할 프록시 서버를 사용하여, 프록시 서버와 동일한 도메인 및 포트에서 작동하도록 구성할 수 있습니다. 이렇게 하면 쿠키가 프록시 서버와 공유되고, 프록시 서버가 백엔드로 요청을 전달합니다.
이러한 방법 중 하나를 선택하여 프론트엔드와 백엔드 간의 통신 및 쿠키 공유를 구성할 수 있습니다.
각 방법에는 장단점이 있으므로 프로젝트 요구 사항 및 보안 고려 사항에 따라 적절한 방법을 선택해야 합니다.
결국 풀지 못했지만 JSESSIONID 의 도메인은 내가 지정한대로 생성이 되지 않았다.
아래와 같이 SOOBINSESSIONID 를 Custom 해서 사용하니 잘 되었다.
server:
servlet:
session:
cookie:
secure: true
same-site: none
http-only: true
name: SOOBINSESSIONID
domain: XXX.com
참고