인프런 커뮤니티 질문&답변

퇴근후치맥님의 프로필 이미지
퇴근후치맥

작성한 질문수

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

Users Microservice - JWT 생성

jwt 토큰은 보통 어디에서 보관을 하나요?

해결된 질문

작성

·

2.4K

1

안녕하세요 강의 재밌게 보고 있습니다.

제가 프론트엔드에는 무지하여 잘 모르겠는데 jwt 를 서버에서 

반환해주면 프론트에서는 일반적으로 어디에 저장을 하다가

요청 보낼때 마다 재사용하나요?

로컬 스토리지나 쿠키 정도 밖에 떠오르는게 없는데 프론트엔드 현업에서 자주 사용하는 방식이 있나요?

답변 4

8

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다. 

JWT는 사용자 브러우저 냉의 안전한 장소에 저장되어야 합니다. LocalStorage에 저장하게 되면, 페이지 내부의 모든 스크립트에서 엑세스 할 수 있기 때문에, XSS의 공격 대상이 되거나 외부 공격자가 토큰에 접근할 수도 있게 됩니다. 따라서, LocalStorage나 SessionStorage에 저장하는 것은 좋은 방법이 아니라고 생각됩니다. 

JWT는 HTTP 요청으로만 서버에 전송되는 HttpOnly 쿠키 내에 저장되어야 합니다. 예를 들어, 다음과 같이 저장해 볼 수 있습니다.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies

'Set-Cookie':[

    'my_cookie=springcloud',

    'Permanent=cookies; Max-Age=${60*60*24*30}',

    'Secure=Secure; Secure',

    'HttpOnly=HttpOnly; HttpOnly'

]

감사합니다. 

1

local storage에 저장하세요 많은 논문과 글을 읽었는데 둘은 본질적으로 별차이가 없습니다. 일반적인 악성코드에 경우 local storage가 더 안전할 겁니다.

+저는 그리고 차라리 세션을 추천합니다.

Stop using JWT for sessions - joepie91's Ramblings (cryto.net)

제가 알기로 http only는 자바스크립트 접근이 안돼서 XSS 공격에 상대적으로 안전한 반면, local storage는 자바스크립트로 쉽게 접근이 가능하여 XSS 공격에 취약하며, CSRF 공격에도 취약한 것으로 알고 있는데요.

Local Storage가 더 안전하다고 생각하시는 근거가 있는지 궁금합니다. 추후에 제가 만들 MSA 시스템에 jwt를 도입해보려고 하는데 도입 전에 많은 정보가 필요해서요. 괜찮으시다면 지식 공유 부탁드려도 될까요?

지식 공유 감사합니다. 하지만 읽어보니 XSS 공격을 회피하기 위해 Local Storage 사용을 자제하고 Http Only와 같은 방법을 채택하는 여러가지 조언들도 XSS 공격에서 자유로울 수 없다. 그렇기 때문에 Local Storage의 편리함을 생각했을 때, 큰 차이가 없다는 의미인 것 같습니다.

하지만 본문에서도 Local Storage는 매우 쉽게 훔칠 수 있는 반면, 다른 방법들이 궁극적으로는 피할 수 없지만 어렵게는 만든다고 하는 것 같습니다. 그렇기에 스크립트 접근과 훔치는 난이도를 생각하면, Local Storage가 더 안전하다는 표현만은 ChatGPT도 그렇고 저도 적절한 표현은 아니라는 생각이 듭니다.

그럼에도 토큰 방식이 보안을 위해 여러가지 고려할 사항이 많은 것은 사실인 것 같습니다. 그래서 추천하신 것처럼 세션이 토큰에 비해 안전하긴 한데, 트래픽 처리나 모바일 어플리케이션 등에서 토큰 방식을 필요로 하니까 여러 모로 개발하기가 쉽지만은 않네요.

일반적인 악성코드에 경우 더 안전하다고 한것은 csrf 공격은 xss공격을 통한 csrf공격뿐만 아니라 referer체크나 api의 get/post구분을 안해놨을때 xss를 방지했더라도 csrf에 취약할 수 있습니다.

만약 쿠키에 저장했을때 email등을 통한 단순한 링크 클릭만으로만 csrf가 발생할 수 있습니다. 로컬스토리지는 일단 js로 접근을 해야하니까요

그렇군요. 무슨 의미인지 알 것 같습니다. 깨닫게 되는 점이 있네요. 좋은 정보 공유해주셔서 감사합니다!

1

저도 이 질문이 궁금하네요!

0

'Set-Cookie':[

    'my_cookie=springcloud',

    'Permanent=cookies; Max-Age=${60*60*24*30}',

    'Secure=Secure; Secure',

    'HttpOnly=HttpOnly; HttpOnly'

]

위의 코드는 백엔드에서 작성 하는건가요?

퇴근후치맥님의 프로필 이미지
퇴근후치맥

작성한 질문수

질문하기