코알못

5분안에 구축하는 OAuth 서버 - 04 본문

JAVA

5분안에 구축하는 OAuth 서버 - 04

코린이s 2022. 1. 1. 14:54
728x90

이번 시간에는 세션을 redis로 변경하여 하여 로그인 관리를 해본다 !

보통 상용 환경에서는 서버 한대로는 부족하기에 여러대로 운영하기에 기본 로컬 메모리를 사용하게 되면 로그인을 진행한 서버가 아닌 다른 서버로 요청이 갈시 로그인 정보가 없기에 다시 로그인을 해야하는 상황이 발생한다

이를 방지하기 위해 redis 를 사용하여 사용자 세션 정보를 한곳에서 관리 한다!

우선 redis로 전환하기 전 로컬 메모리에 저장되는 세션 만료 시간은 아래와 같이 설정 가능하다.

server:
  servlet:
    session:
      timeout: 60s # 기본 30분이며 60s 미만 설정시 60초로 된다.

로그인시 60초 뒤에 다시 로그인 페이지 호출시 로그인이 풀린다. (만료전 호출시 로그인을 따로 안해도 토큰 발행이 된다.)

redis 설치는 아래 이전에 레디스 관련 게시글 참고하여 설치 하면 된다.

이제 redis 사용하기 위한 라이브러리와 session에 redis 를 사용하기 위한 라이브러리를 추가한다.

// build.gradle

// spring에서 redis에 대한 의존성
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
// spring에서 redis를 session storage로 사용하기 위한 의존성
implementation 'org.springframework.session:spring-session-data-redis'

그리고 redis 관련 설정을 한다.

// application.yml

spring:
  session:
    store-type: redis # session 을 redis 로 설정
  redis:
    host: localhost
    port: 6379
server:
#  servlet:
#    session:
#      timeout: 10 # 세션 저장소(redis) 따로 지정 안할시 해당 설정으로 세션 시간 설정 / 기본 30분이며 60s 미만 설정시 60s로 된다.

그리고 아래와 같이 redis 관련 추가 설정을 한다.

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 10) // 지정시 10초뒤 세션 만료 (해당 어노테이션 사용시 timeout application.yml 로 설정 불가능)
@Configuration
public class SessionConfig {
}

자 이제 로그인을 해보면 redis 에 아래와 같이 저장된다.

10초뒤 다시 조회해보면 아래와 같이 로그인한 유저 데이터(yoolee...)가 없어 졌다

아래와 같이 다시 호출해보면 로그인도 풀린다.

그럼 쿠키도 커스텀하게 설정해본다.

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 10) // 지정시 10초뒤 세션 만료 (해당 어노테이션 사용시 timeout application.yml 로 설정 불가능)
@Configuration
public class SessionConfig {

    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName("CORINSESSIONID");// JSESSIONID 가 기본
        serializer.setCookiePath("/");
        serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$"); // 호출한 도메인으로 설정됨
        return serializer;
    }

}

시간 설정 안했을시 만료시간이 session 이라고 표기되며, 세션과 동일하게 브라우저 닫을시 쿠키가 만료 된다. 

세션 만료시간이 10초 이므로 쿠키도 동일하게 시간 설정을 한다.

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 10) // 지정시 10초뒤 세션 만료 (해당 어노테이션 사용시 timeout application.yml 로 설정 불가능)
@Configuration
public class SessionConfig {

    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName("CORINSESSIONID");// JSESSIONID 가 기본
        serializer.setCookiePath("/");
        serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$"); // 호출한 도메인으로 설정됨
        serializer.setCookieMaxAge(10); // -1 이 브라우저 닫힐때까지 이며, 현재 세션이 10초이고, 10초뒤에는 쿠키도 무의미 하니 10초로 설정
        return serializer;
    }

}

로그인 뒤에 쿠키 정보를 보면 10초뒤가 만료시간으로 나오며, 10초 뒤에 로그인이 풀린다.

다음 시간에는 아래 구글과 같이 다중 로그인 기능을 구현해본다!

끝!

branch-04 참고 :: https://github.com/works-code/oauth2

 

GitHub - works-code/oauth2: 자체적 oauth 2 구축 스타터 코드

자체적 oauth 2 구축 스타터 코드. Contribute to works-code/oauth2 development by creating an account on GitHub.

github.com

 

728x90
Comments