JWT를 사용하는 이유 (쿠키 및 세션 인증 방식과의 차이점)

enjoy89·2024년 4월 27일
0
post-custom-banner

저는 그동안 팀 프로젝트에서 JWT 기반으로 사용자 정보의 인증과 권한 부여 시스템을 구축하였습니다.

오늘은 JWT의 특징과 다른 인증 방식(쿠키, 세션)과의 차이점을 통해 왜 JWT를 사용했는지 설명하겠습니다.

이 포스팅에서는 각각의 인증 방식에 대한 주요 특징만 다룰 예정입니다. 쿠키, 세션, JWT 인증 방식에 대한 자세한 개념은 이 링크를 참고해주세요.


JWT(Json Web Token)이란?

웹 표준(RFC 7519)으로, 인증에 필요한 정보들을 JSON 포맷으로 암호화(base64UrlEncode)시킨 토큰을 의미합니다.
토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자 서명도 들어 있어 정보의 무결성과 인증이 보장됩니다.

JWT 구조

JWT는 다음과 같이 HeaderPayloadSignature 세 부분으로 구성됩니다.

Header(헤더): JWT에서 사용할 타입과 해시 알고리즘의 종류

Payload(페이로드): 사용자의 권한 정보와 사용자 데이터인 클레임(Claim) 정보

  • 클레임(Claim)은 Json(key-value) 형태로 다수의 정보를 넣을 수 있습니다.

Signature(서명): 헤더와 페이로드의 인코딩 값을 합친 후, 헤더에 명시된 알고리즘을 사용하여 암호화한 코드

  • 서명값은 서버 측에서 관리하고 있는 개인키(Private Key)를 통해 암호화 되어있는 상태입니다.
  • 따라서 서명값은 개인키가 유출되지 않는 이상 복호화가 불가능합니다. 이는 토큰의 위변조 여부를 확인하는데 사용됩니다.

인증 과정

  1. 서버는 사용자의 로그인 정보를 통해 검증한 후, JWT를 발급하여 클라이언트에게 전송합니다.
  2. 클라이언트는 이후 요청에 발급 받은 토큰을 포함시켜 서버에 전송합니다.
  3. 서버는 가지고 있는 개인키를 가지고 Signature를 복호화 하여 토큰의 유효성을 검증한 후, 인증을 허용합니다. 이후 클라이언트의 요청을 처리합니다.

JWT 장점

JWT와 쿠키 및 세션 기반 인증 방식의 차이점을 더 깊이 있게 이해하기 위해선, 각 방식의 핵심적인 특징과 운용 방식의 차이를 살펴보아야 합니다.

여기서는 JWT 특징을 중심으로 쿠키 및 세션과의 비교를 통해 각 방식의 장단점을 설명하겠습니다.

  • 쿠키는 클라이언트 측(브라우저)에 정보를 저장하는 방식으로, 서버로 매 요청마다 이 쿠키를 함께 보내 인증 과정을 거칩니다.
  • 쿠키는 클라이언트의 로컬에 저장되기 때문에, 사용자가 직접 삭제하지 않는 이상 정보가 유지됩니다.
  • 서버는 사용자의 상태를 확인하기 위해 매 요청마다 쿠키를 확인해야 하므로 서버 측에서 상태를 유지(stateful)해야 합니다.
  • 쿠키는 XSS(Cross-site scripting) 공격에 취약할 수 있으며, 클라이언트 측에서 쿠키를 조작할 가능성이 있어 보안상의 문제가 발생할 수 있습니다.

Session 인증 방식

  • 세션 인증 방식은 서버 측에 사용자 정보를 저장합니다.
  • 클라이언트는 처음 인증을 성공하면, 서버로부터 고유한 세션 ID를 발급 받습니다.
  • 클라이언트는 이후의 요청에서 세션 ID값만을 전송하며, 서버는 세션 ID를 통해 사용자의 정보를 조회하여 인증 과정을 진행합니다.
  • 이 방식은 서버가 각 사용자의 상태를 직접 관리하므로 상태를 유지하는(stateful) 방식이며, 세션 정보가 서버에 집중되어 있어 사용자가 많아질수록 서버의 부담이 증가합니다.

JWT 인증 방식의 장점

  • JWT 기반 인증 방식은 토큰 자체에 포함된 Signature을 검증하여 사용자를 인증합니다.
  • JWT는 필요한 모든 정보(사용자 식별 정보, 권한 등)를 암호화하여 토큰 자체에 포함시키므로, 서버에서 별도의 세션 상태를 저장할 필요 없이 Stateless한 통신을 가능하게 합니다.
  • 이는 서버로부터 들어오는 요청마다 토큰을 검증하기만 하면 되므로 서버의 부하를 줄이고 확장성을 높일 수 있습니다.

JWT 인증 방식의 단점

쿠키와 세션에 비해 장점이 크지만, 단점도 존재합니다.

  • 토큰 무효화의 어려움 : 만약 토큰이 탈취된다면, 토큰 만료 시간까지 대처가 어렵습니다.
    이는 토큰의 만료 시간을 짧게 설정하여 대비할 수 있지만, 즉각적인 대응은 힘들 수 있습니다.
  • 토큰 재발급 시스템 관리 : JWT를 사용하면 토큰의 만료 시간, 재발급 등을 관리해야 합니다. 이 과정에서 추가적인 로직이 필요하며, 잘못된 시스템을 구축할경우 보안 문제로 이어질 수 있습니다.

정리

쿠키와 세션 방식은 클라이언트와 서버 간의 상태 정보를 유지하며(stateful) 인증을 처리합니다.
쿠키는 클라이언트 측에(브라우저), 세션은 서버 측에 각각 데이터를 저장하며 서버의 자원을 사용하게 되어 서비스 규모가 커질 수록 관리가 복잡해질 수 있습니다.

반면, JWT는 필요한 모든 정보(사용자 식별 정보, 권한 등)를 암호화하여 토큰 자체에 포함시키므로, 서버에서 별도의 세션 상태를 저장할 필요 없이 Stateless한 통신을 가능하게 합니다.
이는 서버로부터 들어오는 요청마다 토큰을 검증하기만 하면 되므로 서버의 부하를 줄이고 확장성을 높일 수 있습니다.

이처럼 JWT는 쿠키와 세션에 비해 강력한 장점이 존재하므로, JWT를 사용하여 사용자 인증 정보를 효율적으로 관리할 수 있습니다.

profile
Backend Developer 💻 😺
post-custom-banner

0개의 댓글