언제 JWT 액세스 토큰을 재발급해야 하나요? 새로 고침 토큰의 첫 번째 사용 고려

대체 JWT 새로 고침 토큰을 어떻게 사용합니까?

이전에 헤더에 JWT 토큰을 보낸 적이 없지만 새로 고침 토큰을 사용하는 것은 이번이 처음입니다.오전.

허, 그런데 액세스 토큰이 만료되기 전에 새로 고침 토큰을 서버로 보낸 다음 새 액세스 토큰을 발급해야 하는 것으로 알고 있습니다.

이 만료된 토큰을 대체 언제 전달해야 합니까..?

아직 어떤 방법이 맞는지 모르겠어서 제 생각을 적어보겠습니다.

다른 분들은 어떻게 사용하시는지 구글링 해봐야겠습니다.

내가 생각한 것은 다음과 같습니다.

1. 액세스 토큰 만료 기간을 추적하고 새로운 액세스 토큰을 발급하기 n분 전에 서버와 통신합니다.

– 그러면 주기적으로 액세스 토큰의 exp를 계산해야 할 것 같습니다.

현재는 엑세스 토큰의 만료 시간이 1시간으로 설정되어 있는데, 세션 저장소에 토큰이 업로드 된 후 일정 시간 동안 주기적으로 체크를 합니다..?

2. 모든 서버 요청에서 액세스 토큰이 유효한지 확인하십시오.

서버에서 401 상태 코드가 반환되면 새 액세스 토큰이 발급됩니다. (401인줄 알았는데 400이더군요.)

– 그렇다면 서버와 통신할 때마다 토큰의 유효성을 확인해야 할까요?

현재 axios를 사용하고 계시기 때문에 먼저 인터셉터를 통해 접근 토큰의 유효성을 확인하는 방법이 있는 것 같습니다.

음 근데 생각해보니 질문 하나 더이것을 얻었다

암튼 1,2만 해도 서버가 새 액세스 토큰을 발급하려면 새로 고침 토큰을 전달해야 합니다. 나는 그것을 얻을 수 있었다

새로 고침 토큰도 세션 저장소에 저장해야 합니까?

액세스 토큰이 도난당할 위험이 있어서 새로 고침 토큰을 사용하지 않았습니까?

그렇다면 새로 고침 토큰도 저장소에 보관할 경우 도난당할 위험이 동일하지 않습니까?

그렇다면 리프레시 토큰은 어디에 보관해야 할까요..? 하하하하(무한무한)


이미지 출처: 몽글

누군가 내 옆에 있었으면 좋겠어 물음표 살인그랬던 것 같아요.

새로고침 토큰은 어디에 저장하나요?

1. 스토리지에 저장하기 전에 클라이언트는 이를 암호화하여 스토리지에 저장합니다. (암호화하면 복호화도 해야지… ㅋㅋㅋ)

2. 쿠키에 저장하는건 예전에 살짝 본거 같은데 쿠키에 저장하는거랑 뭐가 다른가요? (몰라서 검색해봄)

새로고침 토큰을 쿠키에 넣어도 괜찮은지 검색해봤습니다.

잘 정리된 블로그 글읽어보니 새로고침 토큰이 httpOnly 쿠키로 안전하게 저장되어 있는 것 같습니다.

그런데 현재 로그인 후 서버로부터 액세스 토큰과 새로 고침 토큰을 받고 있습니다.

지금은 서버 응답 헤더에 Set-Cookie 헤더가 없기 때문에 httpOnly 쿠키를 사용할 수 없습니다.

따라서 다음과 같은 보안 문제가 있습니다.


현재 로그인이 성공하면 서버의 응답으로 액세스 토큰과 새로 고침 토큰이 본문에 포함됩니다.

몸으로 넘기기 때문에 도난당할 경우 보안상 문제가 되지 않을까요?

HttpOnly 및 Secure 속성이 설정된 쿠키를 통해 새로 고침 토큰을 사용하는 것이 안전한 것으로 간주됩니다.

실제로 클라이언트가 아무리 안전하더라도 응답 본문이 도난당하면 아무 소용이 없습니다.

이 부분은 클라이언트에서 해결하는 방법이 아닙니다…..

나중에 가능하면 백엔드 팀원과 문제를 논의하겠습니다.

따라서 주어진 조건에서 가능한 고객이 할 수 있는 최선의 방법 선택하고 싶다


해결 방법, 새로 고침 토큰 암호화

Set-cookie가 서버에 설정되지 않았습니다.고객의 최선과 차선의 방법

응답으로 받은 새로 고침 토큰 암호화그래서 세션 저장소에 저장하는 방법을 선택하기로 했습니다.

암호화를 위해 crypto-js 라이브러리를 설치했습니다.

이제 AES 알고리즘을 사용합니다. 새로 고침 토큰 암호화할 일.


암호화 코드

새로 고침 토큰은 암호화되어 세션 스토리지에 저장됩니다.

새로운 액세스 토큰이 발급되면 새로 고침 토큰 다시 해독 해야한다.


암호화된 갱신 토큰

사용자의 닉네임 정보는 현재 액세스 토큰으로 복호화 후 사용하는데, 닉네임을 변경하면 복호화 토큰에 반영되지 않는 문제가 있었습니다. 다시 로그인할 때까지 이전 닉네임으로 사용됩니다.

이 문제를 해결하기 위해 닉네임 변경 시 엑세스 토큰을 재발급하기로 했습니다.

하지만 계속해서 Access Token 재발급을 요청하면 서버 부하 증가그다지 좋은 방법은 아니라고 생각합니다.

닉네임당 한번씩 엑세스토큰 교체..? 강제로 프로필 변경에 시간 제한을 두지 않는 이상 n초마다 엑세스 토큰을 재발급 받을 수 있는 시나리오가 됩니다.

사실 닉네임에 중요한 로직이 없다면 다음 로그인 시 닉네임 변경이 반영된다면 큰 문제는 없을 것 같습니다.

팀원이 작업하고 있는 페이지에 약간의 버그가 있어(닉네임을 사용하는 로직이 있음) 리프레시 토큰 복호화 테스트를 위해 이 부분을 먼저 해보기로 했습니다.

하지만 아무리 생각해도 닉네임 변경 시 토큰 재발급 괭이로 무언가를 삽질하는 느낌오전.

논리가 최고다 변경할 수 있는 닉네임이 아니라 고정된 pk 값이어야 합니다. 부작용은 없을 것입니다.


구글에서 가져온

제가 처음부터 닉네임 논리를 잘못 적었나 봅니다…….

도미노처럼 사슬에 매여 무너지는 걸 간신히 막고 있는 것 같은 느낌이 드는 건 왜일까요?

성공적으로 로그인하면 토큰을 받는 것이 아닙니다. 닉네임도 답

세션 저장소는 이런 곳에 저장하고, 변경하고, 꺼냈어야 합니다. 같은.

현재는 로그인에 성공해야만 토큰을 받을 수 있어서 토큰 복호화를 선택했는데 연쇄반응이 일어날 줄은 몰랐네요..

지금은 논리를 수정하기 위해 거의 모든 것을 갈아야합니다. 팀원들과 함께 목요일까지 완료 예정이 때문에 로직 변경은 향후 과제해보자.

그래도..

우리는 이미 그 강을 건넜으니 새로 고침 토큰을 사용하여 액세스 토큰을 재발급하는 논리를 작성해 봅시다.


아 테스트하다가 이상한 글을 썼네요

닉네임을 바꾸면 글 닉네임도 바뀌는 것을 확인했습니다.

문제는 작성된 글에 엄청난 버그가 있어서 응답코드 500 오류가 발생했다는 것입니다.

뭔가 잘못됐나봐…… 그 글은 DB에서 삭제밖에 안되는 글이 되어버렸어…….

토큰이 재발급되면 액세스 토큰과 새로 고침 토큰이 모두 재발급됩니다.

그래서 새 액세스 토큰과 암호화된 새로 고침 토큰을 다시 세션 저장소에 저장해야 했습니다.

그리고 신규로 엑세스 토큰을 발급받은 유저들의 게시물은 모두 500개의 에러를 발생시켰습니다.

어디가 잘못됐나요? 해결할 수 있을까요?

내 잘못이야…?

다른 계정을 만들고 확인했습니다. 내 잘못한 사람으로서..!

중간에 테스트하는 동안 다른 계정은 잘 작동했습니다. 토큰을 업데이트하지 않고 게시물을 작성했기 때문일 수 있습니다.


어쨌든 기쁘다

어디서부터 디버깅을 시작해야 할지 모르겠습니다.

고장난 내 첫 번째 계정은 DB를 다시 지우도록 요청해야 합니다. ㅋㅋㅋ

새로 고침 토큰을 테스트하기 위해 방금 박살낸 코드를 여전히 리팩토링해야 하고 여전히 할 일이 많습니다.

Refresh Token 사용에 대한 의문이 어느 정도 해소되어 다행입니다.

이제 진짜, 진짜 열쇠 액세스 토큰 만료 시 새 액세스 토큰 발급논리 수신이것은 들어가야 한다

테스트 중에 새로운 버그를 발견했습니다.


닉네임이나 사진만 바뀌면 문제가 없는데, 올린 후 닉네임이 바뀌면 프로필 사진이 날아간다.

도대체 무슨 일인가 싶어 콘솔을 확인해보니 CORS 때문이었다..! 이상하게도 한동안 그런 일이 있었고 나타나지 않았다. (무엇)

다음은 500 코드가 반환되고 이미지가 Xbox로 완전히 변경되는 문제입니다.

CORS가 뜨는지 확인을 해보았는데 계속 엑세스토큰을 재발급받아서인지 계속 이미지를 보내서인지는 모르겠지만 어느순간 에러코드 500이 리턴됩니다. 그리고 다시 확인하면 이미지가 완전히 날아갑니다. 음.

잠시 접어두고 다른 부분부터 먼저 해결해보도록 하겠습니다..

다시 본론으로..!!


액세스 토큰 재발급 받기

갱신 토큰도 만료된 경우 404 코드,

액세스 토큰과 새로 고침 토큰이 메모리에서 검색된 토큰과 다르면 400이 반환된다고 말했습니다.

액세스 토큰 만료도 400이므로 액세스/새로 고침 토큰이 일치하지 않을 때와 어떻게 구별할 수 있습니까? 조금 의구심이 드는데 아직 Refresh Token 관련 로직은 확인해보지 못해서 좀 더 지켜봐야 할 것 같습니다. (401인줄 알았는데 400이라고 하더라구요..!)

그래도, 액세스 토큰의 남은 유효 시간이 5분 미만일 경우 새로운 액세스 토큰이 발급됩니다.나는 그것을 얻을 생각이다.

테스트해보고 싶은데 액세스 토큰이 55분에 도달할 때까지 기다릴 수 없습니다.

먼저 제가 작성한 코드는 다음과 같습니다.


유통기한이 언제인지는 아직 확인하지 못해서 오류가 있을 수 있습니다.

우선 다른 부분을 먼저 구현해보고 이상한 부분이 있으면 수정하도록 하겠습니다.

리팩토링은 로직 구현 완료 후 진행할 예정입니다.