70. JWT

박선규's avatar
Apr 03, 2024
70. JWT
📎
JWT(Json Web Token)는 클라이언트와 서버 간에 정보를 JSON 형식으로 안전하게 전송하기 위해 사용되는 토큰이다. 인증 및 정보 전송에 주로 사용되며, 헤더(Header), 페이로드(Payload), 서명(Signature)의 세 부분으로 구성됩니다. 이 구조는 정보의 안전한 전달을 보장하며, 페이로드 부분은 필요한 인증 정보를 담기 위해 수정될 수 있다.
 
  • 헤더(Header): 토큰의 타입(JWT)과 해싱 알고리즘 정보를 담고 있다.
  • 페이로드(Payload): 사용자의 인증 정보 및 필요한 데이터를 담고 있으며, Base64Url로 인코딩되어 표현된다.
  • 서명(Signature): 헤더와 페이로드를 합친 후, 비밀키로 해시하여 생성합니다. 이는 토큰의 무결성을 보장한다.
 

JWT (JSON Web Token)

  • 정보 저장 방식: JWT는 필요한 인증 및 권한 정보를 토큰 자체에 포함해. 이 토큰에는 사용자 정보와 같은 클레임(Claim)들이 포함되어 있고, 이 정보는 서명되어 있기 때문에 서버는 별도의 저장소 없이 클라이언트로부터 받은 JWT를 검증할 수 있어.
    • 동작 방식:
        1. 클라이언트가 로그인하면 서버는 사용자 정보를 JWT로 인코딩하고 서명한 뒤, 이를 클라이언트에게 전달.
        1. 클라이언트는 이후 요청 시마다 이 JWT를 서버에 전달.
        1. 서버는 토큰을 받아 서명을 검증하고, 그 안에 포함된 정보를 이용해 인증 및 권한을 판단.
 

JWT 와 세션 비교

JWT의 장단점

장점
  • 분산 시스템에 유리: JWT는 토큰 기반 인증 시스템으로, 서버와 클라이언트 간의 통신이 자유롭고, 서버의 부하를 줄일 수 있다.
  • 확장성: 다양한 서비스와의 연동이 용이하며, 마이크로서비스 아키텍처에 적합하다.
  • 자가 포함적: JWT는 필요한 모든 정보를 자체적으로 포함하고 있어 별도의 인증 저장소가 필요 없다.
단점
  • 토큰 탈취 위험: 한 번 발급된 토큰은 만료될 때까지 유효하므로, 탈취당하면 보안 문제가 발생할 수 있다.
  • 토큰 크기: JWT는 세션 ID에 비해 크기가 크므로, 매 요청마다 헤더에 포함시켜 전송해야 하기 때문에 네트워크 부하가 증가할 수 있다.

세션의 장단점

장점
  • 보안성: 서버 측에서 사용자의 인증 정보를 관리하기 때문에, 보안성이 높다.
  • 상태 유지: HTTP의 비연결성, 비상태성 문제를 해결하며, 사용자의 상태 정보를 서버에서 관리할 수 있다.
단점
  • 서버 부하: 모든 사용자의 세션 정보를 서버에서 관리해야 하므로, 사용자가 많을 경우 서버의 부하가 증가할 수 있다.
  • 확장성 제한: 세션 정보가 특정 서버에 저장되므로, 로드 밸런싱이나 서비스 확장 시 세션 공유 문제가 발생할 수 있다.

왜 JWT 를 써야 할까?

📌
지금까지 했던 Server Side Rendering 방식에선 세션을 사용해왔다. 세션은 서버의 확장성이 제한되는 단점이 있지만, Redis나 Sticky 세션등의 방식으로 해결할 수 있다. 그렇다면 확장성 이외에 어떤 이유로 JWT 를 사용할는걸까?
 
 
notion image
📌
브라우저는 쿠키를 통해 세션ID를 서버에 안전하게 전달 할 수 있다.
 
notion image
📌
하지만 브라우저를 제외한 다른 기종은 브라우저와 달리 분산된 클라이언트 환경으로 서버가 모든 기기의 세션을 관리하는 것이 복잡하고 비용이 많이 들 수 있기 때문에 JWT를 사용하는 것이 부하를 줄일 수 있다.
 
📌
JWT는 서명된 토큰이기 때문에 서버와의 통신이 없더라도 토큰 자체만으로 인증을 처리할 수 있어. 서버가 다운되거나 네트워크 연결이 일시적으로 끊긴 경우에도 토큰이 유효한 기간 동안은 유효한 인증 상태를 유지할 수 있지. 이 특징은 네트워크 연결이 불안정한 환경이나 오프라인 상태에서 사용할 수 있는 모바일 앱이나 스마트 TV 앱에 유리해.
  • 휴대폰: 예를 들어, 네트워크 연결이 불안정한 곳에서도 앱이 정상적으로 작동할 수 있고, 네트워크가 복구되면 정상적으로 서버와 연결해 JWT를 사용해 인증을 처리할 수 있어.
 
 
notion image
 
만약 여러 기종을 호환해야 하는 서비스라면 어떻게 될까? 브라우저만을 위해 세션을 쓰게 되면 세션 서버와 JWT 를 사용하는 서버가 각각 있어야 할 것이다
 
📌
정리하면 세션보다 JWT를 쓰는 이유는 단순히 확장성 만은 아니다. 브라우저만 사용하는 서비스에서는 세션을 사용하는 것도 좋은 선택이다. 하지만 브라우저가 아닌 다른 기종도 함께 서비스를 해야 한다면 JWT로 통일해 하나의 서버를 운영하는 것이 효율적일 것이다.
Share article

p4rksk