학습/개발노트

[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

 

패킷 분석기 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

csrf : csrf 토큰 방어가능

https://junhyunny.github.io/information/security/spring-boot/spring-security/cross-site-reqeust-forgery/

 

CSRF(Cross-Site Request Forgery) 공격과 방어

<br /><br />

junhyunny.github.io

 

로그인시 발행되는 쿠키 분석

- 티스토리

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번이 이루어진다.