Jwt/Jwt 토큰갱신

Springboot Jwt 토큰 재발급!(1) with 리프레시토큰

디비드킴 2021. 7. 17. 22:05

이제 로그인 시
리프레시 토큰
유효기간을 체크 해서
리프레시 토큰 기간이 남았다면
로그인 시 리프레시 토큰 미발급을 진행하겠다

이유는
우리가 하루에 네이버/카카오 등
횟수를 생각하면 그때그때마다
리프레시 토큰을 db에 넣으면 엄청나 질 것이다


테스트 한건만 81개이다
3일 치 다 가지고 있었다면!
엄청났을 것이고 유저가 많다면!
리프레시 토큰 db가 아주 난리가 날것이다
그래서 로그인 시 기한 검사를 해주자!

application

application.properties

처음으로 사용해봤다
근데 저 노란 줄... 거슬리는데
작동은 잘된다
잘못 쓰고 있나
더 검사해봐야겠다!

utillService

utillService.java

timeStamp->localDateTime으로 변환 해주자
LocalDateTime timestamp2=timestamp.toLocalDateTime();
오늘 날짜를 구하자
LocalDateTime today= LocalDateTime.now();
오늘 날짜에 토큰 기한만큼 더해주자
timestamp2=timestamp2.plusSeconds(10);
비교를 해주자
if(timestamp2.isBefore(today))

jwtService

jwtService.java

리프레시 토큰 발급/재발급 흐름이다

첫 로그인인지 확인한다
if(jwtDto==null)
맞다면 발급해준다
refreshToken=getJwtToken();
insertRefreshToken(refreshToken,userid);
아니라면 기간을 확인한다
if(checkRefreshTokenValidity(jwtDto.getCreated()))
지났다면
이전 토큰을 지우고
새로 발급해 준다
refreshToken=getJwtToken();
deleteRefreshToken(jwtDto);
insertRefreshToken(refreshToken, userid);
아니라면 기존 토큰을 넣어준다
refreshToken=jwtDto.getTokenName();

함수들

jwtService.java


기존 토큰이 존재하는지 찾는 함수
없다면 null 반환
public jwtDto getRefreshToken(int userid)
토큰 기한을 체크해주는 함수
private boolean checkRefreshTokenValidity
insert함수
private void insertRefreshToken
delete 함수
private void deleteRefreshToken(jwtDto jwtDto)

jwtLoginFilter

jwtLoginFilter.java

훨씬 간단해졌다
response.setHeader("refreshToken", "Bearer "+jwtService.getRefreshToken(jwtDto,principaldetail.getUserDto().getId()));

테스트

리프레시 토큰 유효시간 10초 지정
return JWT.create().withSubject(jwtTokenName).withExpiresAt(new Date(System.currentTimeMillis()+(1000*10))).sign(Algorithm.HMAC512(jwtSing));

로그인

db
vscode

10초 전 바로 로그인

db
vscode

insert를 하지 않는다

10초 뒤 로그인

db
vscode

이전 토큰 삭제 후
새 토큰 insert 정상적이다!

이제 알맞게 7일 정도로
시간을 설정해주자!

utllService

utllService.java

jwtService

jwtService.java

하드 코딩에서 벗어나려고
노력 중이다

jwtService.java


7일로 설정!
public String getJwtToken() {
System.out.println("getJwtToken 리프레시 토큰 제작시작");
return JWT.create().withSubject(jwtTokenName).withExpiresAt(new Date(System.currentTimeMillis()+(86400*refreshTokenValidity))).sign(Algorithm.HMAC512(jwtSing));
}

테스트 역시 성공적!