JWT 사용을 중단하라
6 days ago
8
- JWT는 사용자를 로그인 상태로 유지하는 용도에 맞지 않으며, 이 목적에는 일반 쿠키 세션이 더 적합함
- JWT 사양은 약 5분 이하의 짧은 수명 토큰을 전제로 하며, 세션은 그보다 긴 수명이 필요함
- 안전한 무상태 인증은 실현하기 어렵고, 토큰을 안전하게 다루려면 결국 일부 상태 저장소가 필요함
- 단순 세션 토큰만 담는 JWT는 일반 세션 쿠키보다 비효율적이고 유연성이 낮으며, 인증 정보는 localStorage나 sessionStorage에 저장하지 않아야 함
- 짧은 수명의 서명 토큰이 필요할 때는 보안을 위해 설계된 PASETO가 더 나은 선택이지만, 세션 용도로는 쓰지 않아야 함
핵심 요약
- JWT는 사용자를 로그인 상태로 유지하는 데 쓰지 않아야 하며, 그 목적에는 일반 쿠키 세션이 더 나은 도구임
- JWT는 이 목적을 위해 설계되지 않았고 안전하지 않으며, 로그인 세션 유지에는 정규 쿠키 세션이 더 적합함
- 관련 주제로, JWT 토큰을 포함한 인증 자격 증명은 localStorage나 sessionStorage에 저장하지 않아야 함
- JWT 관련 발표를 볼 수 있지만, CSRF 보호 같은 다른 주제는 대체로 간략히 다뤄지므로 다른 출처에서 별도로 학습해야 함
- 영상 끝부분의 “유효한” JWT 사용 사례도 더 낫고 안전한 도구로 쉽게 처리할 수 있으며, 구체적으로 PASETO가 해당함
JWT를 피해야 하는 이유
- JWT 사양은 약 5분 이하의 매우 짧은 수명 토큰만을 위해 설계됐고, 세션은 그보다 긴 수명이 필요함
- 안전한 방식의 무상태 인증은 가능하지 않으며, 토큰을 안전하게 처리하려면 일부 상태가 반드시 필요함
- 단순한 세션 토큰만 저장하는 JWT는 일반 세션 쿠키보다 비효율적이고 덜 유연하며, 추가 이점을 얻지 못함
- JWT 사양 자체는 보안 전문가들에게 신뢰받지 못하므로, 보안과 인증 관련 용도 전체에서 배제해야 함
반론
- “Google도 JWT를 쓴다”는 반론은 브라우저의 사용자 세션에 해당하지 않음
- Google은 브라우저 사용자 세션에 JWT를 쓰지 않고 일반 쿠키 세션을 사용함
- JWT는 한 서버나 호스트의 로그인 세션을 다른 서버나 호스트의 세션으로 전달하는 Single Sign On 전송 수단으로만 쓰임
- 이 사용 방식은 JWT의 합리적인 사용 사례 범위에 들어감
- Google은 더 안전한 JWT 구현을 만들고 유지할 보안 전문가 자원을 갖고 있음
- Google의 JWT는 사실상 다른 곳의 JWT와 같지 않음
- “무상태가 더 낫다”는 반론은 안전한 인증 요구와 맞지 않음
- “세션 설정 방법을 모른다”는 문제는 대부분의 웹 서버 프레임워크 문서와 구현으로 해결할 수 있음
- 세션 기술은 특별히 새롭지 않기 때문에 세션을 설명하는 글을 자주 보지 못함
- 세션 구현체의 문서만으로도 설정 과정을 따라갈 수 있어야 함
- 거의 모든 웹 서버 프레임워크에는 세션 구현이 들어 있으며, 기본 활성화가 아니더라도 보통 쉽게 활성화할 수 있음
- Express와 다른 Node.js 프레임워크는 높은 모듈성과 단일 목적 성격 때문에 어느 정도 예외에 가까움
- Express에서는 express-session 미들웨어와 저장소에 맞는 store connector를 사용하면 됨
- Postgres, MySQL 또는 가능하면 SQLite와 함께 connect-session-knex 사용을 권장함
단기 토큰
- 어떤 용도에 짧은 수명의 서명 토큰이 필요하다면, 보안을 위해 설계된 PASETO라는 더 나은 사양이 있음
- PASETO를 쓰더라도 세션 용도로는 사용하지 않아야 함
세션 작동 방식
-
Homepage
-
개발자
- JWT 사용을 중단하라