Spring Security + jwt + redis 로그인 흐름

2025. 2. 3. 17:12·BackEnd

동작과정

 

먼저 jwt와 redis를 이용한 로그인 프로세스가 어떻게 되는지 알아보자.

1. 클라이언트는 서버에게 로그인 요청을 보낸다.

2. 서버는 ID/PW를 검증 후 Access Token + Refresh Token을 발급하고 Redis에 Refresh Token을 저장한다.

3. 클라이언트는 API요청을 할 때 Access Token을 헤더에 담아서 요청하게 된다.

4. 서버는 API응답 또는 Access Token 만료 응답을 내려준다.

5. 클라이언트는 재발급 요청을 한다. (Request Body에 Access Token과 Refresh Token을 담아 보낸다.)

6. 서버는 토큰 검증 후 새로운 Access Token과 Refresh Token을 발급한다.

 

왜 레디스인지?

레디스는 메모리 기반 (NoSQL) 데이터베이스이다. 디스크 I/O 병목 없이 빠른 읽기/쓰기 속도를 제공한다.

유저가 로그인할 때 액세스토큰은 클라이언트에서, 리프레시토큰을 레디스에서 관리하게 된다.

 

액세스 토큰이 탈취되어도 만료 시간이 짧기 때문에 영향이 제한적이다. 만약 리프레시 토큰을 탈취당하면 새로운 액세스 토큰을 계속 발급할 수 있으므로 꼭 서버에서 관리하자.

 

AuthService.java

public SignInResponse signIn(LoginRequest request) {
        User user = userRepository.findByUserEmail(request.getUserEmail())
                .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 이메일입니다."));

        if (!passwordEncoder.matches(request.getUserPassword(), user.getUserPassword())) {
            throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
        }

        String accessToken = jwtTokenProvider.generateAccessToken(user.getUserId(), user.getRoleType());
        String refreshToken = jwtTokenProvider.generateRefreshToken(user.getUserId(), user.getRoleType());

        refreshTokenService.saveRefreshToken(user.getUserId(), refreshToken);

        boolean isRegistered = user.isRegistered();

        SignInResponse response = SignInResponse
                .builder()
                .accessToken(accessToken)
                .isRegistered(isRegistered)
                .build();

        return response;
    }

 

컨트롤러에서 정해준 엔드포인트로 들어와 다음 비즈니스 로직을 실행한다.

 

로그인 시 먼저 이메일과 비밀번호를 검증한다.

검증이 끝나게 되면 jwtTokenProvider에서 accessToken과 refreshToken을 발급받는다.

 

refreshToken은 refreshTokenService 단에서 redis에 저장한다.

 

RefreshTokenService.java

public void saveRefreshToken(Integer userId, String refreshToken) {
        ValueOperations<String, String> values = redisTemplate.opsForValue();
        values.set(
                "RT:" + userId,
                refreshToken,
                jwtProperties.getRefreshTokenExpiration(),
                TimeUnit.MILLISECONDS
        );
    }

 

리프레시토큰임을 명시해 주고 만료시간을 지정해 레디스에 저장해 준다.

'BackEnd' 카테고리의 다른 글

[Servlet] 서블릿이란?  (1) 2024.09.28
'BackEnd' 카테고리의 다른 글
  • [Servlet] 서블릿이란?
의중
의중
  • 의중
    개발어려워
    의중
  • 전체
    오늘
    어제
    • 전체글 (30)
      • Algorithm (12)
      • SSAFY (1)
      • 자료구조 (4)
      • 운영체제 (2)
      • JAVA (2)
      • ML, DL (0)
      • BackEnd (2)
      • DevOps (1)
      • 네트워크 (3)
      • DB, SQL (3)
  • hELLO· Designed By정상우.v4.10.3
의중
Spring Security + jwt + redis 로그인 흐름
상단으로

티스토리툴바