본문 바로가기

개발중/Spring Boot & Redis

Spring Session storage 를 Redis 로 설정하기 !

728x90
반응형

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

 

 

참고

 

[Cookie] spring boot chrome 80 정책

Spring boot + security + jwt token을 사용하여 Auth 서버를 구축하는 중에 프론트와 상의하여 jwt token을 cookie로 response를 해주기로 하였다. local 환경에서 개발을 마치고 postman으로 확인한 결과 쿠키가 잘

velog.io

 

728x90
반응형