안녕하세요 된짱지걔입니다.

저번 대칭키vs비대칭키에서 설명이 약간 부족했던 것 같아서 보충설명 및 erd(db)에는 무엇을 넣어야할지 설명드리겠습니다.
먼저 토큰(JWT)는 header+payload+signature 로 구성되어있고
header 에는 signature 에 어떤 알고리즘을 사용할지 쓰고
payload는 json 형식으로 내용물을 작성하고
signature는 header+payload 에 해시를 넣고 비대칭키를 사용하는 것입니다!

다음은 erd를 이야기 해볼게요
erd는 우리가 저장해야할 db를 정리하는 다이어그램이라고 할 수 있겠습니다.
저같경 erd cloud 무료버전을 알차게 사용중인데 추천합니다.
제 프로젝트에서는 jwt refresh rotation 을 선택했는데
이미 erd를 전반적으로 짠 상황이기도 하고
멀티 디바이스를 유지하지 않아도 되는 소규모 프로젝트다 보니 사용자 테이블에 토큰까지 넣었는데 이번에 다시 혼자 구상해보면서 토큰 테이블을 따로 만들어보았습니다.

제가 간이 좀 작아서 프로젝트를 유추할 수 없게 사용자테이블을 가려보았읍니다..네.. 양해부탁드리고요..
먼저 토큰을 그대로 넣지 않고 토큰 해시를 넣었죠?
앞서 말씀드렸다시피 해시는 복원이 안됩니다.
따라서 보안을 위해 토큰 해시값을 DB에 넣었습니다.
그리고 토큰 유효기간도 필수로 들어가야겠죠?
그런데 우리가 듣도보도못한 revoke가 들어갔습니다...

사실 제가 듣도보도 못한겁니다...
..같이 알아보도록 하겠습니다
revoke(폐기)란 refresh token의 유효기간이 만료되지 않았지만 강제로 무효화해야할 때!!
사용하는 수단입니다.
그렇담 언제 revoke가 일어날까요?
1. 로그아웃할 때
2. rotation할 때
3. 탈취 의심되
4. 비밀번호 변경할 때
5. 관리자가 강제 로그아웃시킬 때
등,,
그럼 왜 refresh token delete하면 되는데 revoke를 시킬까요?
왜냐면 revoke(= soft delete)는 탈취 탐지, 로그 추적이 가능하기 때문입니다
따라서 실무에서도 즉시 삭제보다는 revoke 를 사용한다고 하네요.
사용자 테이블이지만 이것도 중요하다고 생각해서 제 프로젝트에서 했던 로그인 5분내 3회 실패시 15분 정지에 대해 간략히 설명드릴게요
제 프로젝트가 아니더라도 대부분 로그인을 몇회이상 실패할 경우 정지를 시키자나요??
따라서 우리는
1. 실패횟수를 카운트해야하고
2. 마지막 로그인 실패시간을 알아야합니다
이때 5분안에 3회 실패가 어렵게 들리실 것 같습니다.

왜냐면 저는 어려웟거든요
그래서 설명드리자면!
첫 로그인 실패 ATTEMPT = 1, LAST_FAILED_AT = 5:10
두번째 로그인 실패 ATTEMPT = 2, LAST_FAILED_AT = 5:11
세번째 로그인 실패 ATTEMPT = 1, LAST_FAILED_AT = 5:20
이란뜻입니다.
즉 마지막 로그인 실패시각과 5분 이상 차이날 경우 체인이 끝나는 것!!
먼저 왜 사용자와 토큰의 테이블을 따로 두었을까요?
사용자 안에 refresh token 을 두게 되면 한 사용자가 하나의 refresh token만 가질 수 있읍니다...
허나 refresh token 테이블 자체를 따로 생성하고
erd 관계표시를 one-many(1:N) 로 설정한다면 한 사용자가 여러 refresh token 을 가질 수 있게 되는 것이죠.
즉 멀티 디바이스가 가능해집니다!!

테크놀로지아~!