1. JWT란 ?
JWT는 선택적 서명 및 암호화를 사용하여 JSON 데이터를 보관하고 있는 인터넷 표준 웹 토큰입니다.
모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰을 의미한다.
사용하는 이유는 주로 사용자 인증처리를 위해서입니다.
2. JWT 구조

JWT는 Header(헤더), Payload(내용), Signature(서명)의 3가지로 구분되어 진다.
- Header(헤더)
헤더에는 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있습니다.
- Payload(내용)
내용에는 key-value의 형태로 되어있으며 토큰에 담고싶은 데이터, 제목, 유효시간 등으로 구성되어 있습니다.
- Signature(서명)
서명에는 base64로 인코딩 된 헤더, 내용을 비밀키를 이용하여 해싱 암호화 알고리즘 처리가 이루어진 값으로 구성
되어 있습니다.
3. JWT 과정

4. 특징
- 토큰 자체에 인증정보가 포함되어 있어 별도 인증 저장소(DB, 서버 등)가 필요하지 않음.
- 분산된 서비스 환경에 대응하기 용이.
- 세션 처리와 달리 서버 부하를 낮춤 (인증 저장소가 필요없기 때문).
- 토큰의 만료시간이 지날때 까지 토큰과 관련된 정보를 제어할 수 없음.
- 토큰에 담기는 데이터 양이 많아질수록 토큰도 점점 커짐.
- 대부분의 요청에 토큰이 함께 전송되어 트래픽 크기에 영향을 미칠 수 있다.
5. JWT는 저장은 어디로(보안)? LocalStorage vs. Cookies
JWT를 저장하기 위한 장소에는 2가지 정도가 있다.
localStorage와 cookie.
localStorage란? (pure JavaScript)
세션이나 쿠키 같이 데이터를 저장하는 장소 중의 하나입니다. LocalStorage는 일정한 기간이 지나면 삭제되는 세션과는 달리 데이터의 만료기간이 없이 계속 저장됩니다. 데이터의 값은 항상 문자로 저장해야하며, 간편하게 불러 올 수 있다.
- LocalStorage저장 시 장단점.
장점 : CSRF 공격에는 안전하다.
그 이유는 자동으로 request에 담기는 쿠키와는 다르게 js 코드에 의해 헤더에 담기므로 XSS를 뚫지 않는 이상
공격자가 정상적인 사용자인 척 request를 보내기가 어렵다.
단점 : XSS 공격에 취약하다.
XSS 공격은 당신의 웹사이트에서 공격자가 JavaScript를 실행할 수 있을때 발생한다. 이는 localStorage에 저장되어있는 당신의 access token을 공격자가 탈취할 수 있다는 말이다.
XSS 공격은 React, Vue, jQuery, Google Analytics 등과 같은 당신의 웹사이트에 포함된 third-party JavaScript 코드에 의해서 발생할 수 있다. 하지만 third-party 라이브러리를 웹사이트에 포함하지 않는 것은 거의 불가능하다.
즉, 공격자가 localStorage에 접근하는 Js 코드 한 줄만 주입하면 localStorage를 공격자가 내 집처럼 드나들 수 있다.
third-party란?
다른 회사 제품에 이용되는 소프트웨어나 하드웨어를 개발 하는 회사를 말한다.
https://m.blog.naver.com/dktmrorl/221742981904 자세한 내용은 참고.
- Cookie저장 시 장단점.
장점 : XSS 공격으로부터 localStorage에 비해 안전하다.
쿠키의 httpOnly 옵션을 사용하면 Js에서 쿠키에 접근 자체가 불가능하다. 그래서 XSS 공격으로 쿠키 정보를 탈취할 수 없다. (httpOnly 옵션은 서버에서 설정할 수 있음)
단점 : CSRF 공격에 취약하다.
자동으로 http request에 담아서 보내기 때문에공격자가 request url만 안다면 사용자가 관련 link를 클릭하도록 유도하여 request를 위조하기 쉽다.
단점 : 쿠키는 4KB의 size limit을 가진다. 그러므로 만약 당신이 4KB가 넘는 데이터를 가지는 JWT 토큰을 사용한다면 쿠키는 적절한 선택지가 아닐 수도 있다.
XSS와 CSRF의 자세한 내용은 아래 링크 참고.
https://parkman.tistory.com/10
참조자료
'개발공부 > 개념정리' 카테고리의 다른 글
| REST API(RESTful API) (0) | 2022.04.01 |
|---|---|
| Spring Security 란? (0) | 2022.03.22 |
| XSS(Cross Site Script), CSRF(Cross Site Request Forgery) (0) | 2022.03.22 |
| 쿠키(Cookie), 세션(Session), 캐시(Cache)의 개념과 특징 (0) | 2022.03.18 |
| API(Application Programming Interface) (0) | 2022.03.14 |