JWT 사용을 중단하라

6 days ago 8
  • JWT는 사용자를 로그인 상태로 유지하는 용도에 맞지 않으며, 이 목적에는 일반 쿠키 세션이 더 적합함
  • JWT 사양은 약 5분 이하의 짧은 수명 토큰을 전제로 하며, 세션은 그보다 긴 수명이 필요함
  • 안전한 무상태 인증은 실현하기 어렵고, 토큰을 안전하게 다루려면 결국 일부 상태 저장소가 필요함
  • 단순 세션 토큰만 담는 JWT는 일반 세션 쿠키보다 비효율적이고 유연성이 낮으며, 인증 정보는 localStorage나 sessionStorage에 저장하지 않아야 함
  • 짧은 수명의 서명 토큰이 필요할 때는 보안을 위해 설계된 PASETO가 더 나은 선택이지만, 세션 용도로는 쓰지 않아야 함

핵심 요약

  • JWT는 사용자를 로그인 상태로 유지하는 데 쓰지 않아야 하며, 그 목적에는 일반 쿠키 세션이 더 나은 도구임
  • JWT는 이 목적을 위해 설계되지 않았고 안전하지 않으며, 로그인 세션 유지에는 정규 쿠키 세션이 더 적합함
  • 관련 주제로, JWT 토큰을 포함한 인증 자격 증명은 localStorage나 sessionStorage에 저장하지 않아야 함
  • JWT 관련 발표를 볼 수 있지만, CSRF 보호 같은 다른 주제는 대체로 간략히 다뤄지므로 다른 출처에서 별도로 학습해야 함
  • 영상 끝부분의 “유효한” JWT 사용 사례도 더 낫고 안전한 도구로 쉽게 처리할 수 있으며, 구체적으로 PASETO가 해당함

JWT를 피해야 하는 이유

  • JWT 사양은 약 5분 이하의 매우 짧은 수명 토큰만을 위해 설계됐고, 세션은 그보다 긴 수명이 필요함
  • 안전한 방식의 무상태 인증은 가능하지 않으며, 토큰을 안전하게 처리하려면 일부 상태가 반드시 필요함
    • 데이터 저장소가 필요하다면 일부 토큰 상태만 다루기보다 모든 데이터를 저장하는 편이 더 나음
    • 관련 문제는 http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/에서 더 자세히 다뤄짐
    • 실제로 JWT를 이런 방식으로 쓰는 애플리케이션이 있지만, 그런 애플리케이션은 결함이 있으므로 같은 실수를 반복하지 않아야 함
  • 단순한 세션 토큰만 저장하는 JWT는 일반 세션 쿠키보다 비효율적이고 덜 유연하며, 추가 이점을 얻지 못함
  • JWT 사양 자체는 보안 전문가들에게 신뢰받지 못하므로, 보안과 인증 관련 용도 전체에서 배제해야 함

반론

  • “Google도 JWT를 쓴다”는 반론은 브라우저의 사용자 세션에 해당하지 않음
    • Google은 브라우저 사용자 세션에 JWT를 쓰지 않고 일반 쿠키 세션을 사용함
    • JWT는 한 서버나 호스트의 로그인 세션을 다른 서버나 호스트의 세션으로 전달하는 Single Sign On 전송 수단으로만 쓰임
    • 이 사용 방식은 JWT의 합리적인 사용 사례 범위에 들어감
    • Google은 더 안전한 JWT 구현을 만들고 유지할 보안 전문가 자원을 갖고 있음
    • Google의 JWT는 사실상 다른 곳의 JWT와 같지 않음
  • “무상태가 더 낫다”는 반론은 안전한 인증 요구와 맞지 않음
    • 막대한 자원 없이는 진정한 무상태 인증을 안전하게 운영할 수 없음
    • 관련 논의로 Stateless is a lie를 참고할 수 있음
  • “세션 설정 방법을 모른다”는 문제는 대부분의 웹 서버 프레임워크 문서와 구현으로 해결할 수 있음
    • 세션 기술은 특별히 새롭지 않기 때문에 세션을 설명하는 글을 자주 보지 못함
    • 세션 구현체의 문서만으로도 설정 과정을 따라갈 수 있어야 함
    • 거의 모든 웹 서버 프레임워크에는 세션 구현이 들어 있으며, 기본 활성화가 아니더라도 보통 쉽게 활성화할 수 있음
    • Express와 다른 Node.js 프레임워크는 높은 모듈성과 단일 목적 성격 때문에 어느 정도 예외에 가까움
    • Express에서는 express-session 미들웨어와 저장소에 맞는 store connector를 사용하면 됨
    • Postgres, MySQL 또는 가능하면 SQLite와 함께 connect-session-knex 사용을 권장함

단기 토큰

  • 어떤 용도에 짧은 수명의 서명 토큰이 필요하다면, 보안을 위해 설계된 PASETO라는 더 나은 사양이 있음
  • PASETO를 쓰더라도 세션 용도로는 사용하지 않아야 함

세션 작동 방식

  • 세션 작동 방식을 더 배우려면 joepie91의 gist를 확인하는 편이 좋음
Read Entire Article