-
[JWT] 어디에 저장하는게 좋을까?학습/개발노트 2022. 10. 28. 22:35
사전 준비
Authentication Server에서 API서버에 AccessToken과 RefreshToken을 발급한 상태
클라이언트에 저장방법
1. SessionStorage
세션 변수로써 새창, 새로고침 등에 추가로직이 필요함
2. Localstorage
글로벌 변수
XSS 취약점 : 방어 불가능
ex) 공격예제
<script> alert(localStorage.getItem(‘AccessToken’)) </script>
3. 로컬변수
새로고침 시 토큰이 사라짐
4. 쿠키
XSS 취약점 : HttpOnly 속성 사용으로 방어 가능
<script> alert(document.cookie); <script>
스니핑 : Secure 속성 사용으로 방어 가능
https://ko.wikipedia.org/wiki/%ED%8C%A8%ED%82%B7_%EB%B6%84%EC%84%9D%EA%B8%B0
csrf : csrf 토큰 방어가능
로그인시 발행되는 쿠키 분석
- 티스토리 Tsession - 카카오 Developers _klawit _kawItea _karmt _karmtea _kahai 전체 HttpOnly, Secure, SameSite : none - 네이버 NID_AUT ( HttpOnly ) NID_JKL ( Secure ) NID_SES - 구글 SID _Secure ... 등 수많은 쿠키가 추가됨
기업들도 쿠키를 사용하여 로그인 유지
결론
1. 쿠키에 속성추가로 스니핑과 XSS공격은 차단할 수 있다.
2. CSRF 방어로직을 추가하고 쿠키에 담자
추가문제
AccessToekn과 RefreshToken 모두 쿠키에 담는다.
Q. 재발급 로직은 어디에 있어야할까?
1. 클라이언트
클라이언트와 서버 두군데에 로직이 발생한다,
클라이언트 : AccessToken 만료 확인
클라이언트 > 서버 : 재발급 요청
서버 : 재발급 요청
서버 > 클라이언트 : 클라이언트 쿠키 등록
클라이언트 : 재발급 확인 후 로직 다시 시작
2. 서버
서버 : AccessToken 만료 확인
서버 : 재발급 요청
서버 > 클라이언트 : 클라이언트 쿠키 등록
서버 로직 다시 시작
서버에서 로직을 수행하도록 선택
추가문제
토큰 만료는 랜덤이다.
Q. 스크립트에서 비동기로 여러번 요청이 올경우 동시성 문제가 발생하여 토큰 재발급이 3번이 이루어진다.
'학습 > 개발노트' 카테고리의 다른 글
OAUTH 2.0 정리 (0) 2022.10.19 FINAL 키워드의 집착을 버려본다. (0) 2022.10.14