Jwt/Jwt 토큰갱신

Springboot Jwt 토큰 재발급!(2) with 시큐리티 예외처리

디비드킴 2021. 8. 3. 10:59

리프레시 토큰 사용전
서버 토큰 발급 형식을 둘다 쿠키로 바꿨다
https://cordingmonster.tistory.com/119?category=1039797

Springboot Jwt +마이페이지 하기전 셋팅!(1) localStorage-> 쿠키

좀 바꿔줘야 할 부분이 있었다 크게 두부분이다 1. 액세스 토큰 -localStorage->쿠키 형식으로 변환 2. 토큰 검증 시스템 변환 -현재는 새 토큰을 발급받아도 전혀 사용 중이지 못하는 중이었다 이제

cordingmonster.tistory.com


이제 프런트에서
쿠키로 토큰을 줬을 때
유효기간 검사를 하고
지났다면 새 토큰을 전달해주자!

https://cordingmonster.tistory.com/95?category=1035704

Spring boot Jwt토큰 검증하기!(1) with BasicAuthenticationFilter

요청이 오면 시큐리티는 BasicAuthenticationFilter로 보내는 거 같다 왜냐면 테스트를 해봤는데 모든 페이지 이동시 이 필터가 걸려있는 쪽으로 온다 1.jwtAuthorizationFilter 만들기 헤더 검사 if(request.get..

cordingmonster.tistory.com

여기서 소스를 추가해주자

jwtAuthorizationFilter

jwtAuthorizationFilter.java

토큰 기간만료시
캐치로 가게 된다
TokenExpiredException

캐치에서 지정해논 컨트롤러로 보낸다
RequestDispatcher dp=request.getRequestDispatcher("/auth/jwtex");
dp.forward(request, response);

이렇게 하는 이유는
여기서 에러가 터져도
이미 만들어논 컨트롤러 전역 에러 핸들러에
가지 않는다 왜?
컨트롤러에 들어가지 전에 에러가 터진 것이어서 이다
그래서 캐치로 잡아서 컨트롤러로 강제로 보내주는것이다

restcontroller

restcontroller.java

오자마자 에러를 하나 넣어둔다

errorRestController

errorRestController.java

리프레시 토큰 꺼내기
String refreshToken=request.getHeader("refreshToken");
정상적인 토큰인지 검사
if(refreshToken.startsWith("Bearer"))
배리어 제거
refreshToken=refreshToken.replace("Bearer ", "");
리프레시토큰 기간 확인 및
함께 저장해 논 유저 정보 가져오기
jwtDto jwtDto=jwtService.getRefreshToken(refreshToken);
새 토큰 발급
String newJwtToken=jwtService.getNewJwtToken(jwtDto);
json으로 전달
JSONObject jsonObject=new JSONObject();
jsonObject.put("Authorization", newJwtToken);
jsonObject.put("refreshToken", refreshToken);
return jsonObject;

테스트를 하기 위해
프론트를 만들어 보자

프런트엔드

jwtService

jwtService.java

쿠키 가져오기
String jwtToken=cookie.getValue();
String refreshToken=cookie2.getValue();
서버와 통신 시도
JSONObject jsonObject=callApiService.callApi(jwtToken,refreshToken, url);
반환 값에 토큰이 하나라도 있다면
if(jsonObject.get(AuthorizationTokenName)!=null||jsonObject.get(refreshTokenName)!=null)
새 액세스 토큰 or 리프레시 토큰 쿠키 저장
jwtToken=(String)jsonObject.get(AuthorizationTokenName);
aList.add(AuthorizationTokenName);
aList.add(jwtToken);
새 토큰으로 다시 통신
jsonObject=callApiService.callApi(jwtToken,refreshToken, url);

이러면 두 번씩 통신하는 거 아니냐?!
그렇지 않다

첫 통신에 성공했다면
if(jsonObject.get(AuthorizationTokenName)!=null||jsonObject.get(refreshTokenName)!=null)안으로 들어오지 않기 때문!

테스트

로그인하자마자 요청
프런트

vscode

백엔드

vscode

정상적으로 도착

유효기간 30초 뒤

프런트

vscode

별 변화가 없어 보인다 하지만 자세히 보면
이전 토큰이 기간이 다돼서 서버에서
다시 토큰을 받아서 다시 인증한 뒤
정보를 받아왔다

백엔드

vscode

에러 발생!

vscode

새 토큰을 만들어서 전달!
그리고 바로 다시 온 요청

vscode

정상적 처리 완료!

쿠키 확인!

http://localhost:3030/myPage

페이지 이동후 정상적으로
새 토큰이 쿠키에 들어가 있다!

'Jwt > Jwt 토큰갱신' 카테고리의 다른 글

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