jwt란 JSON Web Token의 약자
jwt는 header,payload,signature로 나눠져있는데
Header는 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있습니다. 첫째는 토큰의 유형 (JWT)을 나타내고, 두 번째는 HMAC, SHA256 또는 RSA와 같은 해시 알고리즘을 나타내는 부분입니다.
Payload는 토큰에 담을 클레임(claim) 정보를 포함하고 있습니다. Payload 에 담는 정보의 한 ‘조각’ 을 클레임이라고 부르고, 이는 name / value 의 한 쌍으로 이뤄져있습니다. 토큰에는 여러개의 클레임 들을 넣을 수 있습니다.
클레임의 정보는 등록된 (registered) 클레임, 공개 (public) 클레임, 비공개 (private) 클레임으로 세 종류가 있습니다.
Signature는 secret key를 포함하여 암호화되어 있습니다.
ex)
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NjM3NDA4MzgsImlhdCI6MTY2MjUzMTA1OCwic3ViIjoiMSJ9.6SFagZKjko3Lagm-js0ugxUuI823OBQA40nsTT1jsxg
.을 중심으로 header,payload,signature를 의미한다
header = eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
payload = eyJleHAiOjE2NjM3NDA4MzgsImlhdCI6MTY2MjUzMTA1OCwic3ViIjoiMSJ9
signature = 6SFagZKjko3Lagm-js0ugxUuI823OBQA40nsTT1jsxg
위 사이트에서 token 테스트 가능하다
구현
access는 유효기간(30분~2시간)이 짧고
refresh는 유효기간(2주~1달)이 길다.
가입할때 access와 refresh를 발급하여 클라에게 전송 refresh는 db에 저장한다
클라에서 api요청시 access를 header에 넣어서 확인
서버에 만료된 access가 왔을때
토큰안의 id를 가진 유저정보 확인 ->문제있으면 오류
refresh token의 존재여부 확인 -> 문제있으면 오류(직접 임의로 지웠을시 재로그인 유도)
내가가진 refresh token과 같은지확인 ->문제있으면 오류
문제없을시 access 재발급
access만료시 refresh token도 만료시 -> 오류
로그아웃시 db에서 refresh를 지워서 access재발급을 못하도록 한다
보안을 위해 2주마다 재로그인을 해야한다
jwt방식 시간에 맞춰 강제로그아웃하기엔 적합하지않다 (추가작업필요)
강제로그아웃하는일이 생기는 서비스라면 session을 이용한 보안방식을 선택하라
참고:
'python > fastapi' 카테고리의 다른 글
nginx ELB-HealthChecker/2.0 log 없애기 (0) | 2023.03.17 |
---|---|
sqlmodel create_all table생성 안될때 (0) | 2022.08.31 |
[Errno 48] Address already in use (0) | 2022.08.29 |