서론
CS 스터디를 준비하다가 웹 보안에 대한 주제로 스터디를 진행하기로 하였다. 그 중 JWT에 대한 내용을 조사하다가 고민해본 점을 정리한다.
What is JWT
JSON Web Token의 준말입니다. 자바스크립트의 Object(Key Value) 자료구조를 가지고 있으며, Web Token으로써 사용할 수 있다는 의미다.
JWT 사용 이유
HTTP는 기본적으로 state-less를 지향합니다. state-less(무상태)란? 서버-클라이언트 구조에서 서버가 클라이언트의 상태를 가지고 있지 않는 것.
- 장점1: 서버의 확장성이 높으며 대량의 트래픽이 발생해도 대처할 수 있음.
- 장점2: (서버가 분리되어 있는 경우) 특정 DB/서버에 의존하지 않아도 인증할 수 있음.
- 단점1: state-ful(세션) 방식보다 비교적 많은 양의 데이터가 반복적으로 전송되므로 네트워크 성능저하가 될 수 있음.
- 단점2: 데이터 노출로 인한 보안적인 문제 존재
→이 단점을 보완하기 위해 JWT로 데이터 압축 및 서명를 위하여 JWT를 사용합니다.
JWT의 구성
aaaaaaa.bbbbbbb.ccccccc //헤더.페이로드.시그니처
구성은 헤더, 페이로드, 시그니처로 나뉩니다. 각 역할은 다음과 같습니다.
- 헤더: 토큰 타입, 암호화 알고리즘 명시
- 페이로드: JWT에 넣을 데이터, JWT 발급 / 만료일 등 명시
- 시그니처: 헤더, 페이로드가 변조 되었는지를 확인하는 역할
여기서 시그니처는 서명이라는 의미로 암호화하지 않고 변조 여부만을 확인하는 것이 JWT의 기본적인 구조입니다. (암호화하는 방식도 존재)
토큰 vs 세션
간단히 요약하면,
- 토큰 방식은 토큰이 보안, 유저 데이터를 관리한다.
- 세션 방식은 서버에 보안, 유저 데이터를 관리한다.
가장 큰 차이는 보안이 뚫렸을 때가 있습니다. 우선 세션 방식이 뚫리고 서버 개발자가 이를 알아챈다는 가정이면 서버 개발자가 세션을 만료시켜 추가적인 피해를 막을 수 있습니다.
다만 토큰 방식이라면 말이 다릅니다. 서버 개발자가 토큰을 만료시키거나 별도의 작업을 할 수 없습니다. 만약 여기서 "메모리/DB에 저장해두고 거기서만 지워버리면 안되나요?" 라고 말한다면.. 그건 토큰 방식이 아니라 토큰을 자료구조로 사용하는 세션 기반 인증방식입니다.
그렇다면 탈취당한 상태에서는 탈취된 토큰을 만료시키는 방법은 없을까요? 비슷한 방식이 있습니다. 리프레시 토큰을 사용하면 됩니다.
왜 엑세스 토큰과 리프레시 토큰이 분리되어있는가?
단어 키워드를 보면, 엑세스와 리프레시.. 직관적인 네이밍이다. 무슨 역할을 하는지 확인해보자.
- 엑세스 토큰: 서버 API를 직접 요청할 때 사용한다.
- 리프레시 토큰: 엑세스 토큰이 만료되었을 때 엑세스 토큰을 재발급할 목적으로 사용한다.
분리하는 목적은?
클라이언트와 서버 간의 API 통신 중, 토큰이 탈취당할 수 있기 때문이다.
- 그래서 직접 API를 호출하는 엑세스 토큰의 주기는 짧게 하고, (약 1시간)
- 엑세스 토큰을 재발급하는 리프레시 토큰의 주기는 비교적 길게 한다. (약 2주)
이런식으로 진행하면 엑세스 토큰이 털리더라도 만료 주기가 짧기 때문에 피해를 조금이나마 줄일 수 있다.
이게.. 의미가 있나요..?
엑세스/리프레시 토큰 방식은 중간에 탈취당하는 케이스를 고려하고 있습니다. 그래서 엑세스 토큰 안에 중요한 값은 넣지 않습니다.
유저 식별용 데이터라면 세션과 비슷하게 DB에 가상 ID 혹은 노출되도 상관없는 데이터를 넣습니다.
다만, 리프레시 토큰은 탈취 당할 수 있으니, 클라이언트에서 안전하게 저장하는 방식으로 개발이 진행됩니다.
따라서 토큰에는
- 털렸을 때 가장 쓸모없는 데이터로,
- 서버에서 유저(데이터)를 식별할 수 있을 것.
이게 토큰에서 가장 좋은 방식입니다.
그래서 결론
- 토큰 기반 인증: 몇 만명의 인증 방식을 저장하고 있지 않기 때문에, 가볍고 확장성이 좋은 방식.
- 세션 기반 인증: 무겁지만, 그만큼 보안성이 좋은 방식. (그닥 무겁지도 않음..)
장단점이 확실하니, 프로젝트 기획과 시선에 따라 상호 대체 / 함께 사용이 가능합니다.
레퍼런스
- JWT 웹 사이트 https://jwt.io/
- JWT 소개 https://jwt.io/introduction
'CS' 카테고리의 다른 글
데이터베이스 Lock이란 (0) | 2023.03.15 |
---|---|
트랜잭션 격리 수준 (0) | 2023.03.07 |
[PostgreSQL] 데이터베이스 트랜잭션이란? (0) | 2023.03.06 |
[ 개발바닥 2사로 ] 면접 스터디를 시작하며.. (10) | 2023.02.15 |
Git Flow란, 깃 브랜치 전략 (0) | 2022.09.06 |
글 내용 중 잘못되거나 이해되지 않는 부분은 댓글을 달아주세요! 감사합니다! 문의: puleugo@gmail.com