JWT란 무엇인가?

@Changmin · December 02, 2024 · 6 min read

JWT란 무엇인가?

JSON Web Token (JWT) 는 JSON 기반의 토큰으로, 정보를 안전하고 간결하게 주고받기 위한 기술입니다. JWT는 주로 인증(Authentication)권한 부여(Authorization) 에 사용되며, HTTP 헤더, URI 쿼리 파라미터 등 공간이 제한된 환경에서도 쉽게 활용할 수 있습니다.

인증/인가를 위한 방식으로 다양한 선택지가 있지만, 매번 인증/인가를 위해 DB에 직접 연결(DB Connect)을 수행하면 성능 문제가 발생할 수 있습니다. 이를 해결하기 위해 서버가 사용자의 인증 상태를 유지할 수 있는 토큰 방식이 도입되었고, 그중 하나로 널리 사용되는 것이 JWT 방식의 인증/인가입니다.

그럼 우리는 과연 JWT에 대해서 어느정도까지 알고 사용하고 있을까요?

JWT의 구조

JWT는 세 가지 주요 부분으로 구성됩니다:

  1. Header (헤더): 토큰의 메타데이터를 포함. (e.g., 서명 알고리즘, 타입)
  2. Payload (페이로드): 전달할 데이터를 담고 있는 JSON 객체.
  3. Signature (서명): 데이터의 무결성을 보장하기 위한 서명 값.

JWT는 다음과 같은 형식으로 표현됩니다:

Header.Payload.Signature

예시:

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWS와 JWE

JWT는 크게 두 가지 형태로 사용됩니다: JWS (JSON Web Signature)JWE (JSON Web Encryption)

JWS와 JWE
JWS와 JWE

JWS (JSON Web Signature)

JWS는 JWT에 디지털 서명을 추가하여 무결성을 보장합니다.

특징

  • 데이터를 서명하여 위변조 방지를 보장.
  • 서명은 토큰을 발급한 서버만 확인할 수 있음.
  • 단, 데이터는 암호화되지 않으므로 평문으로 노출될 수 있음.

JWS 예제

헤더와 페이로드를 서명한 결과:

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwicm9sZSI6ImFkbWluIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWE (JSON Web Encryption)

JWE는 JWT를 암호화하여 기밀성을 보장합니다.

특징

  • 데이터를 암호화하여 내용을 보호.
  • 제3자가 데이터를 읽지 못하도록 보장.
  • 단, 암호화만 제공하므로 발급자가 신뢰할 수 있는지는 확인할 수 없음.

JWE 예제

암호화된 JWT는 다음과 같이 구성됩니다:

eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4R0NNIn0....

JWS와 JWE의 차이점

특징 JWS JWE
기능 무결성 보장 (위변조 방지) 기밀성 보장 (암호화)
데이터 암호화 암호화되지 않음 암호화됨
주요 사용 목적 데이터의 신뢰성 확인 데이터의 내용 보호

JWS와 JWE 결합

JWS와 JWE를 결합하면 기밀성과 무결성을 모두 보장할 수 있습니다. 과정은 다음과 같습니다:

  1. JWS 생성: 데이터를 서명하여 무결성을 보장.
  2. JWE 암호화: 생성된 JWS를 암호화하여 기밀성을 추가.

결과적으로 암호화된 데이터의 무결성까지 확인할 수 있는 안전한 토큰이 만들어집니다.


JWT의 장점

  1. 간결성 (Compact):

    • Base64URL로 인코딩되어 HTTP 헤더나 URI에서도 쉽게 사용 가능.
  2. 독립성 (Self-contained):

    • 필요한 정보를 자체적으로 포함하므로 서버 측 세션 저장소가 불필요.
  3. 확장성 (Scalable):

    • 표준 클레임과 커스텀 클레임을 조합하여 다양한 요구를 충족 가능.

보안 모범 사례

JWT를 안전하게 사용하기 위해 다음을 권장합니다:

  1. 민감한 정보 저장 금지:

    • JWT는 디코딩이 쉬우므로 비밀번호와 같은 민감한 데이터는 저장하지 말 것.
  2. HttpOnly 쿠키 사용:

    • XSS 공격을 방지하기 위해 브라우저에서 접근 불가능한 쿠키에 저장.
  3. CSRF 방지:

    • 쿠키로 JWT를 사용할 경우 CSRF 방어를 반드시 적용.
  4. 강력한 키 사용:

    • 서명과 암호화를 위한 키는 충분히 길고 복잡해야 함.
  5. 짧은 만료 시간:

    • 토큰의 유효 기간을 짧게 설정하여 리스크를 최소화.

마무리

JWT는 간결하고 강력한 인증 및 권한 부여 도구로, JWS와 JWE를 통해 다양한 보안 요구를 충족할 수 있습니다. 그러나 사용 목적에 맞는 적절한 구현과 보안 설정이 필요합니다. 이번 글에서 소개한 내용을 바탕으로 JWT를 더 안전하게 활용할 수 있길 바랍니다.

궁금한 점이나 추가적인 논의가 필요하다면 댓글로 남겨주세요!

@Changmin
Hello :) I'm Changmin