RefreshToken 을 이용해 AccessToken을 갱신해보자.
import { Auth } from 'aws-amplify';
...
<div>
<Button
style={{ color: 'white' }}
onClick={() =>
Auth.currentSession()
.then((data) => {
console.log(data);
console.log(
'auth_time :',
new Date(data.getAccessToken().payload.auth_time * 1000)
);
console.log(
'exp :',
new Date(data.getAccessToken().payload.exp * 1000)
);
console.log(
'iat :',
new Date(data.getAccessToken().payload.iat * 1000)
);
})
.catch((e) => console.log(e))
}
>
Session Test
</Button>
</div>
const [previousAccessToken, setPreviousAccessToken] = useState();
const comparing - (pre, cur) => {
pre === cur ? ture : false
}
...
try {
const cognitoUser = await Auth.currentAuthenticatedUser();
const currentSession = await Auth.currentSession();
setPreviousAccessToken(currentSession.getAccessToken().getJwtToken());
console.log(
'auth_time',
new Date(currentSession.getAccessToken().payload.auth_time * 1000)
);
console.log(
'iat',
new Date(currentSession.getAccessToken().payload.iat * 1000)
);
console.log(
'exp',
new Date(currentSession.getAccessToken().payload.exp * 1000)
);
cognitoUser.refreshSession(
currentSession.refreshToken,
(err, session) => {
const currentAccessToken = session.getAccessToken().getJwtToken();
console.log(
'Comparing AccessToken',
comparing(previousAccessToken, currentAccessToken)
);
console.log(
'auth_time in callback',
new Date(session.getAccessToken().payload.auth_time * 1000)
);
console.log(
'iat in callback',
new Date(session.getAccessToken().payload.iat * 1000)
);
console.log(
'exp in callback',
new Date(session.getAccessToken().payload.exp * 1000)
);
}
);
} catch (e) {
console.log('Unable to refresh Token', e);
}
결과 : cognitoUser.refreshSession 실행 전, 후 accessToken, idToken, iat, exp 변동 발생. auth_time, refreshToken 변동 없슴.
현상 : 찍힌 로그상 accessToken이 갱신되고 토큰 발행시간 만료시간도 같이 갱신된다. 하지만 auth_time으로부터 AWS cognito 설정에서 정해놓은 액세스 토큰 만료 시간이 지난 후 페이지 이동시 자동 로그아웃.
발급받은 jwt를 localStorage에 저장해놓고 사용중인데 refreshSesstion()은 토큰을 새로 발급받아주기만 할 뿐 localStorage에 저장된 토큰을 갱신시켜주지 않기때문에 새로 발급받은 accessToken을 기존 token을 저장하고있던 localStorage에 강제로 갱신해보기로 마음먹었다.
결과 : 생각대로 잘 작동한다! (매우기쁨) 왜 이 당연한 과정이 생각안났을까... (자괴감) 정말 당연하겠지만 localStorage가 아닌곳에 token을 저장해두고 사용한다면 그곳을 갱신시켜주는 과정이 필요할것같다.
삽질(어마어마함) : 생각대로 잘 작동해서 기쁜 마음에 예전에 만들어두었던 exp가 지나면 나오게 만든 못생긴 경고창을 (겁도없이) 잠금해제한것이 문제가 되었다. 이때부터 잘 동작하던녀석이 삐뚤어지기 시작하는데 이것이 경고창이 문제라는것을 너무 늦게 깨달았다. 잠금해제한 경고창은 강제로 갱신된 localStorage에 accessToken에 담긴 정보가 아닌 갱신해주지 않은 다른 저장소를 참조하고 있었기 때문이다. 아~ 내 소중한 시간... 오늘 또한번 느낀점이지만 개발이 서툴땐 step by step!!! 한단계씩 가자... 조금 느리더라도.
A cross-origin error was thrown. React doesn't have access to the actual error object in development. See https://reactjs.org/link/crossorigin-error for more information.