1. RefreshToken (Entity)
@Getter
@Setter
public class RefreshToken implements Serializable {
private static final long serialVersionUID = 6494678977089006639L;
private String refreshToken;
private String email;
public RefreshToken(String token, String email) {
this.refreshToken = token;
this.email = email;
}
public RefreshToken updateToken(String token) {
this.refreshToken = token;
return this;
}
}
- redis에 저장되는 객체들은 Serialize 가능해야함
- 이 값을 지정해주지 않으면 컴파일러가 계산한 값이 부여됨(변동성있음) 게다가 컴파일러는 Serializable class 혹은 Outer Class를 참고하여 만들기 때문에 이 클래스가 변동이 되면
- serialVersionUID도 변경이 있을 수 있음 (역시 변동성이 있음)
- 이 UID가 달라지면 기존에 저장된 객체를 읽을 수가 없게 됨. (저장하는 쪽, 불러오는 쪽 컴파일러가 다를 경우, 저장하는 시기의 클래스 내용과 불러오는 시기의 클래스의 내용이 다를 경우 등)
- 데이터를 저장하는데 있어 이런 변동성은 위험하기에 serialVersionUID을 지정.
출처 : 소영님
- 아래는 3조 분들이 노션에 작성한 부분 ! ( 출처 : 눈치코치캐치 노션)
- ChatRoom 에 Serializable 를 구체화한 이유
Redis의 저장방식은 byte array 형식이기 때문에 직렬화를 하여 캐싱을 할 때 넘겨줘야 합니다.
Java에서의 객체 직렬화는 Serializable 인터페이스를 구현한 것에서만 가능하다고 이해를 하고 있습니다.
그래서 Redis를 이용하는 ChatRoom 에서 Serializable 를 구체화 했습니다.
2. TokenDto
@Getter
@NoArgsConstructor
public class TokenDto {
private String accessToken;
private String refreshToken;
public TokenDto(String accessToken, String refreshToken) {
this.accessToken = accessToken;
this.refreshToken = refreshToken;
}
}
3. RefreshTokenRepository
// 기능 : Redis에 Refresh Token 저장
@Repository
@RequiredArgsConstructor
public class RefreshTokenRepository {
private final RedisTemplate<String, String> redisTemplate;
private long expiredTime = 3 * 60L; // 리프레시토큰 유효시간 : 3분
// 특정 RefreshToken 조회
public RefreshToken findByEmail(String email){
RefreshToken refreshToken = new RefreshToken(redisTemplate.opsForValue().get(email), email);
return refreshToken;
}
// RefreshToken 저장
public RefreshToken saveRefreshToken(RefreshToken refreshToken){
redisTemplate.opsForValue().set(refreshToken.getEmail(), refreshToken.getRefreshToken(),expiredTime,TimeUnit.SECONDS); // 리프레시 토큰 유효시간 설정 : 3분 이부분 추후에 수정 필요 !
return refreshToken;
}
// RefreshToken 삭제
public void deleteRefreshToken(String email){
redisTemplate.delete(email);
}
}
1. findByEmail()
- redisTemplate.opsForValue() 를 이용해 Redis에 String 형태의 리프레시토큰을 저장하고, 사용자를 식별해 줄 이메일을 저장해준다.
2. saveRefreshToken()
- 리프레시 토큰을 레디스와 저장함과 동시에 유효시간을 저장해준다. 유효시간이 끝나면 자동 삭제 된다.
- 테스트용이기 때문에 일단 exprited time을 3분으로 설정해둠. 실제 서비스에는 1주 - 2주 정도로 할 예정.
3. deleteRefreshToken
- 로그아웃 하는 경우 리프레시 토큰을 삭제해줌
opsForValue() 참고자료
더보기
- RedisTemplate은 Redis 서버에 Redis 커맨드를 수행하기 위한 high-level-abstractions을 제공하고 Object 직렬화, Connection management를 수행한다.
- 또한 Redis 서버에 데이터 CRUD를 위해, Redis의 다섯가지 데이터 유형에 대한 Operation Interface를 제공하는데 아래와 같다.
< 메소드명반환 오퍼레이션Redis 자료구조 >
opsForValue() | ValueOperations | String |
opsForList() | ListOperations | List |
opsForSet() | SetOperations | Set |
opsForZSet() | ZSetOperations | Sorted Set |
opsForHash() | HashOperations | Hash |
- RedisTemplate: RedisTemplate은 Thread-Safe 하며 재사용 가능
- JacksonJsonSerializer: JSON 포맷으로 데이터를 저장하는 경우
※ Redis 내장 함수를 통해 저장되어있는 데이터를 유효시간이 지나면 자동 삭제할 수 있는데, 두 가지 방법이 있다. 지금 작성되어있는 방법이 아니라 다른 방법으로 수정할 예정이라 수정이 끝나는 대로 비교해서 다시 포스팅 하는 걸로 ! 투비컨티뉴 ....! 수정이 끝나는 대로 깃헙 링크를 올리겠습니다 : )
[ 참고 자료 ]
https://devlog-wjdrbs96.tistory.com/375
'항해99 개발 일지 > [Final] 실전 프로젝트' 카테고리의 다른 글
[27] 5주차 기술멘토링 피드백 정리 (0) | 2023.02.04 |
---|---|
[26] Refresh Token with Redis final! 최종 버전 :) (0) | 2023.02.04 |
[23] Refresh Token 코드 리뷰 (1) (0) | 2023.01.27 |
[22] ubuntu 서버에 Redis 설치하기 (0) | 2023.01.26 |
[20] Spring CI/CD (2) CI 실전편 (0) | 2023.01.25 |