리프레시 토큰 사용전
서버 토큰 발급 형식을 둘다 쿠키로 바꿨다
https://cordingmonster.tistory.com/119?category=1039797
이제 프런트에서
쿠키로 토큰을 줬을 때
유효기간 검사를 하고
지났다면 새 토큰을 전달해주자!
https://cordingmonster.tistory.com/95?category=1035704
여기서 소스를 추가해주자
jwtAuthorizationFilter
토큰 기간만료시
캐치로 가게 된다
TokenExpiredException
캐치에서 지정해논 컨트롤러로 보낸다
RequestDispatcher dp=request.getRequestDispatcher("/auth/jwtex");
dp.forward(request, response);
이렇게 하는 이유는
여기서 에러가 터져도
이미 만들어논 컨트롤러 전역 에러 핸들러에
가지 않는다 왜?
컨트롤러에 들어가지 전에 에러가 터진 것이어서 이다
그래서 캐치로 잡아서 컨트롤러로 강제로 보내주는것이다
restcontroller
오자마자 에러를 하나 넣어둔다
errorRestController
리프레시 토큰 꺼내기
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
쿠키 가져오기
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)안으로 들어오지 않기 때문!
테스트
로그인하자마자 요청
프런트
백엔드
정상적으로 도착
유효기간 30초 뒤
프런트
별 변화가 없어 보인다 하지만 자세히 보면
이전 토큰이 기간이 다돼서 서버에서
다시 토큰을 받아서 다시 인증한 뒤
정보를 받아왔다
백엔드
에러 발생!
새 토큰을 만들어서 전달!
그리고 바로 다시 온 요청
정상적 처리 완료!
쿠키 확인!
페이지 이동후 정상적으로
새 토큰이 쿠키에 들어가 있다!
'Jwt > Jwt 토큰갱신' 카테고리의 다른 글
Springboot Jwt 토큰 재발급!(1) with 리프레시토큰 (1) | 2021.07.17 |
---|