
JWT(Json Webservice Token)은 세션방식의 문제점을 해결하기 위해 등장했습니다.
전통적으로, 웹 애플리케이션은 세션 기반 인증을 사용했습니다. 세션의 상태를 서버측 세션 저장소에 유지하고, 클라이언트는 세션 ID를 쿠키를 통해 서버에 전달합니다. 그러나 이 방식에는 몇 가지 문제가 있습니다.
🌳스케일링 문제
서버가 여러 대일 경우, 각 서버가 같은 세션 상태를 유지해야 한다. 이는 세션 동기화 문제를 일으키며, 네트워크 트래픽 균등화작업에 어려움을 야기합니다.
⬇️성능 저하
각 요청마다 서버가 세션 저장소를 조회해야 하므로, 요청이 많아질수록 성능 저하가 발생할 수 있습니다.
🧑🔧관리 복잡성
세션 만료, 세션 정리, 세션 데이터 저장 등의 관리가 필요합니다.
모던 웹 애플리케이션은 클라이언트와 서버를 분리하여 개발합니다. 이 경우, RESTful API를 사용하는데, 세션 기반 인증은 RESTful API의 무상태(stateless) 원칙과 맞지 않습니다. 무상태원칙에서 클라이언트는 상태를 유지하지 않으며, 모든 요청은 독립적이어야 하지만 세션기반 인증은 서버 클라이언트 모두 세션이 유지되는 상태이므로 원칙간의 충돌이 발생하는 것입니다.
이러한 문제점을 해결하기 위해서 OAuth, JWT, 세션 클러스터링 등 다양한 해결방안이 나왔습니다. 이번 글에서는 JWT의 해결방식과 JWT의 단점과 더불어 어떤 때 세션을 대신해서 사용하면 좋을지에 대해 적어보도록 하겠습니다.
JWT는 클라이언트 측에서 상태를 유지할 수 있는 방법을 제공합니다. 사용자가 인증되면, 서버는 사용자 정보를 포함하는 JWT를 생성하여 클라이언트에게 전달합니다. 이 토큰은 클라이언트의 로컬 저장소에 저장됩니다.
클라이언트는 이후의 모든 요청에 JWT를 포함시켜 서버에 전달합니다. 서버는 이 토큰을 검증하여 사용자 정보를 확인하는데 이 과정에서 서버는 세션처럼 별도의 토큰 저장소를 필요로 하지 않습니다. 왜냐하면 토큰에 자체적으로 인증 정보를 포함하고 있기 때문입니다.
JWT는 세 부분으로 구성됩니다.
🏷️헤더 (Header)
토큰 유형(JWT)과 해싱 알고리즘 정보를 포함합니다.
🪪페이로드 (Payload)
사용자 정보나 기타 메타데이터를 포함합니다.
🔏서명 (Signature)
토큰의 무결성을 보장하기 위해 생성된 서명입니다.
이 세 부분은 각각 Base64Url로 인코딩된 후, 마침내 하나의 문자열로 결합됩니다. 이 구조 덕분에 서버는 별도로 사용자 인증 정보를 저장할 필요 없이 토큰 자체를 검증하여 사용자를 식별할 수 있습니다.
JWT는 정말 좋은 기술이지만 몇가지 보안 이슈때문에 솔루션이 필요합니다.
별도의 조치가 없으면 헤더의 알고리즘을 none로 보내면 뚫리는 경우도 있는데 none로 오면 안받는다거나 하는식으로 보안조치를 취해야 합니다.
인코딩이 매우 쉬워서 탈취당하면 토큰을 인코딩하여 정보를 추출할 수 있으니 민감한 정보는 담지 않는것이 좋습니다.
대충 찍어서 맞출 수 있는 비밀번호 혹은 대중적으로 사용되는(1q2w3e! <- 이런놈들)단순한 비밀번호를 넣어서 하는 Signature 부분을 완성하는 경우가 있는데 키를 매우 길게 만들거나 공유할수 없게 만들어서 보안을 강화하는것이 좋습니다.
JWT는 탈취당할 위험이 있습니다. 탈취당하더라도 세션처럼 사용정지 조취를 취할수 없고 파기할수 없습니다. 그냥 훔쳐지면 뚫리는 것을 구경해야합니다.
그렇기 때문에 훔치기 어렵게 토큰을 httponly cookie에 담아서 보내거나
유효기간을 짧게 만들어서 토큰을 쓰레기로 만들거나 이런 불편한 점을 해결하기 위해 리프레쉬 토큰을 만들어서 배포하는 방법이 있습니다.
또 탈취당한 입장권을 블랙리스트에 등록해서 검사하는 방법이 있는데 세션방식과 유사한 아이러니가 있습니다.
JWT는 상태를 서버에 저장하지 않고 클라이언트 측에서 상태를 유지하게 하여, 서버의 스케일링 문제와 성능 저하 문제를 해결합니다. RESTful API와의 호환성도 높여주며, 인증 및 권한 부여를 효율적으로 처리할 수 있습니다. 하지만 여러가지 보안 이슈때문에 세션방식과 토큰인증방식중에 현재 서비스에 더 좋은 인증방식을 취사선택하여 사용할 수 있습니다.
https://jwt.io/
JWT란 무엇인가? 그리고 어떻게 사용하는가? (1) - 개념
JWT (Json Web Token)의 구조와 사용하기
JWT 대충 쓰면 님들 코딩인생 끝남