Skip to content

Commit

Permalink
feat: 리프레시 토큰 로컬 캐시로 저장소 변경 (#206)
Browse files Browse the repository at this point in the history
* chore: guava implements

* refactor: delete redis code

* feat: set time based InMemoryRepository

* refactor: 토큰 재발급 코드 수정

* test: refreshToken test code

* style: 주석 제거

* test: TokenService test
  • Loading branch information
stophwan authored Dec 6, 2023
1 parent bf4b455 commit 1404120
Show file tree
Hide file tree
Showing 24 changed files with 331 additions and 255 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ dependencies {
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.apache.commons:commons-lang3:3.12.0'

implementation "com.google.guava:guava:32.1.3-jre"
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
implementation "com.querydsl:querydsl-apt:${queryDslVersion}"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@

import javax.validation.Valid;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import com.plzgraduate.myongjigraduatebe.auth.application.port.in.TokenResponse;
import com.plzgraduate.myongjigraduatebe.auth.application.port.in.AccessTokenResponse;
import com.plzgraduate.myongjigraduatebe.auth.application.port.in.token.TokenUseCase;
import com.plzgraduate.myongjigraduatebe.core.meta.WebAdapter;

Expand All @@ -16,12 +15,12 @@
@WebAdapter
@RequiredArgsConstructor
@RequestMapping("/api/v1/auth")
class TokenController {
public class TokenController {

private final TokenUseCase tokenUseCase;

@PostMapping("/token")
public TokenResponse newToken(@Valid @RequestBody TokenRequest tokenRequest) {
public AccessTokenResponse newToken(@Valid @RequestBody TokenRequest tokenRequest) {
return tokenUseCase.createNewToken(TokenRequest.toCommand(tokenRequest.getRefreshToken()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.plzgraduate.myongjigraduatebe.auth.adaptor.out;

import java.util.Optional;
import java.util.concurrent.TimeUnit;

import org.springframework.stereotype.Component;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.plzgraduate.myongjigraduatebe.auth.application.port.out.FindRefreshTokenPort;
import com.plzgraduate.myongjigraduatebe.auth.application.port.out.SaveRefreshTokenPort;

import lombok.RequiredArgsConstructor;

@Component
@RequiredArgsConstructor
public class InMemoryTokenRepository implements FindRefreshTokenPort, SaveRefreshTokenPort {
private static final Cache<String, Long> TOKEN_REPOSITORY = CacheBuilder.newBuilder()
.expireAfterWrite(15, TimeUnit.DAYS)
.build();

@Override
public void saveRefreshToken(String refreshToken, Long userId) {
TOKEN_REPOSITORY.put(refreshToken, userId);
}

@Override
public Optional<Long> findByRefreshToken(String refreshToken) {
return Optional.ofNullable(TOKEN_REPOSITORY.getIfPresent(refreshToken));
}

}

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.plzgraduate.myongjigraduatebe.auth.application.port.in;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class AccessTokenResponse {
private String accessToken;

@Builder
private AccessTokenResponse(String accessToken) {
this.accessToken = accessToken;
}

public static AccessTokenResponse from(String accessToken) {
return AccessTokenResponse
.builder()
.accessToken(accessToken)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.plzgraduate.myongjigraduatebe.auth.application.port.in.token;

import com.plzgraduate.myongjigraduatebe.auth.application.port.in.TokenResponse;
import com.plzgraduate.myongjigraduatebe.auth.application.port.in.AccessTokenResponse;

public interface TokenUseCase {
TokenResponse createNewToken(TokenCommand tokenCommand);
AccessTokenResponse createNewToken(TokenCommand tokenCommand);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@

import java.util.Optional;

import javax.swing.text.html.Option;

import com.plzgraduate.myongjigraduatebe.auth.domain.RefreshToken;

public interface FindRefreshTokenPort {
Optional<RefreshToken> findByRefreshToken(String refreshToken);
Optional<Long> findByRefreshToken(String refreshToken);
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.plzgraduate.myongjigraduatebe.auth.application.port.out;

import com.plzgraduate.myongjigraduatebe.auth.domain.RefreshToken;

public interface SaveRefreshTokenPort {
void saveRefreshToken(RefreshToken refreshToken);
void saveRefreshToken(String refreshToken, Long userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@
import com.plzgraduate.myongjigraduatebe.auth.application.port.in.signin.SignInUseCase;
import com.plzgraduate.myongjigraduatebe.auth.application.port.in.signin.SignInCommand;
import com.plzgraduate.myongjigraduatebe.auth.application.port.in.TokenResponse;
import com.plzgraduate.myongjigraduatebe.auth.application.service.token.RefreshTokenService;
import com.plzgraduate.myongjigraduatebe.auth.domain.RefreshToken;;
import com.plzgraduate.myongjigraduatebe.auth.application.port.out.SaveRefreshTokenPort;
import com.plzgraduate.myongjigraduatebe.auth.security.JwtAuthenticationToken;
import com.plzgraduate.myongjigraduatebe.auth.security.TokenProvider;
import com.plzgraduate.myongjigraduatebe.core.meta.UseCase;
Expand All @@ -22,18 +21,17 @@
class SignInService implements SignInUseCase {

private final TokenProvider tokenProvider;

private final AuthenticationManager authenticationManager;
private final RefreshTokenService refreshTokenService;
private final SaveRefreshTokenPort saveRefreshTokenPort;

@Override
public TokenResponse signIn(SignInCommand signInCommand) {
Authentication authentication = authenticateCommand(signInCommand);
Long userId = (Long) authentication.getPrincipal();
String accessToken = tokenProvider.generateToken(userId);
RefreshToken refreshToken = RefreshToken.createToken(userId);
refreshTokenService.saveRefreshToken(refreshToken);
return TokenResponse.from(accessToken, refreshToken.getRefreshToken());
String refreshToken = tokenProvider.generateRefreshToken();
saveRefreshTokenPort.saveRefreshToken(refreshToken, userId);
return TokenResponse.from(accessToken, refreshToken);
}

private Authentication authenticateCommand(SignInCommand signInCommand) {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
package com.plzgraduate.myongjigraduatebe.auth.application.service.token;

import org.springframework.security.core.Authentication;

import com.plzgraduate.myongjigraduatebe.auth.application.port.in.TokenResponse;
import com.plzgraduate.myongjigraduatebe.auth.application.port.in.AccessTokenResponse;
import com.plzgraduate.myongjigraduatebe.auth.application.port.in.token.TokenCommand;
import com.plzgraduate.myongjigraduatebe.auth.application.port.in.token.TokenUseCase;
import com.plzgraduate.myongjigraduatebe.auth.domain.RefreshToken;
import com.plzgraduate.myongjigraduatebe.auth.security.JwtAuthenticationToken;
import com.plzgraduate.myongjigraduatebe.auth.application.port.out.FindRefreshTokenPort;
import com.plzgraduate.myongjigraduatebe.auth.security.TokenProvider;
import com.plzgraduate.myongjigraduatebe.core.meta.UseCase;

Expand All @@ -15,13 +12,19 @@
@UseCase
@RequiredArgsConstructor
public class TokenService implements TokenUseCase {

private final TokenProvider tokenProvider;

private final RefreshTokenService refreshTokenService;
private final FindRefreshTokenPort findRefreshTokenPort;
@Override
public TokenResponse createNewToken(TokenCommand tokenCommand) {
RefreshToken refreshToken = refreshTokenService.findByRefreshToken(tokenCommand.getRefreshToken());
String accessToken = tokenProvider.generateToken(refreshToken.getUserId());
return TokenResponse.from(accessToken, refreshToken.getRefreshToken());
public AccessTokenResponse createNewToken(TokenCommand tokenCommand) {
Long userId = findByRefreshToken(tokenCommand.getRefreshToken());
String accessToken = tokenProvider.generateToken(userId);
return AccessTokenResponse.from(accessToken);
}

private Long findByRefreshToken(String refreshToken) {
return findRefreshTokenPort.findByRefreshToken(refreshToken)
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 토큰입니다."));
}
}

This file was deleted.

Loading

0 comments on commit 1404120

Please sign in to comment.