IT

JWT란? 동작 원리와 사용 방법 완벽 정리

파파대니 2024. 12. 18. 21:21

목차

    반응형

    JWT란? 동작 원리와 사용 방법 완벽 정리

    안녕하세요. 파파대니입니다.

    JWT(JSON Web Token)는 요즘 웹 개발에서 빠질 수 없는 중요한 인증 방식으로 자리 잡았습니다.

    많은 개발자들이 API 인증이나 사용자 인증 과정에서 JWT를 사용하지만, 처음 접하는 분들에게는 다소 복잡하게 느껴질 수 있습니다.

    특히, JWT의 구조와 동작 방식을 명확히 이해하지 못하면 보안 취약점을 발생시키거나 잘못된 구현으로 문제가 생길 수 있습니다.

    제가 이 글을 쓰게 된 이유는 JWT에 대한 개념을 보다 쉽고 구체적으로 전달하고, 실제 개발에서 바로 활용할 수 있는 팁을 제공하기 위함입니다.

     

    1. JWT란 무엇인가요?

    JWT는 JSON Web Token의 약자로, 데이터를 안전하게 주고받기 위한 토큰 기반 인증 방식입니다.
    쉽게 말하면, 서버가 클라이언트(사용자)에게 신분증 같은 역할을 하는 "토큰"을 발급해 주고, 이 토큰을 가지고 클라이언트가 서버에 요청을 보낼 때마다 신분증을 보여주는 방식입니다.

    이 신분증이 유효한지 확인하면, 별도로 사용자 정보를 저장하지 않아도 빠르고 간단하게 인증이 가능합니다.


    2. JWT의 구성 요소

    JWT는 세 가지 부분으로 이루어져 있습니다.

    이 세 부분은 .으로 구분되며, 각각 다음과 같은 역할을 합니다

     

    1) Header (헤더)

    토큰에 사용된 알고리즘과 타입 정보를 담고 있습니다.

    {
      "alg": "HS256",   // 해싱 알고리즘: HMAC-SHA256
      "typ": "JWT"      // 토큰 타입: JWT
    }

     

    2) Payload (페이로드)

    실제 데이터(사용자 정보, 권한 등)가 들어 있는 부분입니다.

    {
      "sub": "1234567890",  // 사용자 ID
      "name": "홍길동",      // 사용자 이름
      "role": "admin",      // 사용자 역할
      "iat": 1715452190     // 발행 시간
    }

     

    3) Signature (서명)

    앞의 헤더와 페이로드를 합친 후, 비밀 키로 암호화하여 생성된 값입니다.

    이 서명을 통해 토큰이 변조되지 않았음을 서버가 확인할 수 있습니다.

    HMACSHA256(
      base64UrlEncode(header) + "." + base64UrlEncode(payload),
      secret
    )
     

    3. JWT의 동작 과정

    JWT의 동작 과정을 쉽게 이해할 수 있도록 아래와 같이 순서대로 정리했습니다.

     

    1) 사용자 로그인 요청

    사용자가 아이디와 비밀번호를 입력하여 로그인 요청을 보냅니다.

    {
      "username": "honggildong",
      "password": "mypassword123"
    }
     
     

    2) 서버에서 로그인 확인 및 JWT 발급

    서버는 사용자가 입력한 정보를 확인한 후, 로그인이 성공하면 JWT를 생성합니다.

    생성된 JWT에는 사용자 정보(예: ID, 권한)와 만료 시간 등이 포함됩니다.

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhvbmcgR2lsIERvbmciLCJyb2xlIjoiYWRtaW4ifQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
     
     

    3) 클라이언트가 JWT를 저장

    발급된 JWT는 클라이언트가 로컬 스토리지 또는 쿠키 등에 저장합니다.

     

    4) 클라이언트가 서버로 요청할 때 JWT를 포함

    클라이언트는 이후 요청을 보낼 때마다 JWT를 포함시킵니다.

    일반적으로 HTTP 요청의 헤더에 포함됩니다.

    Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
     
     

    5) 서버에서 JWT 검증

    서버는 요청을 받으면 JWT의 서명을 확인합니다.

    JWT가 유효하면, 페이로드에서 사용자 정보를 읽어 요청을 처리합니다.

    만약 서명이 변조되었거나 토큰이 만료되었다면 요청을 거부합니다.

     

    6) 요청 처리 및 응답

    검증이 완료되면 서버는 요청에 따른 데이터를 반환합니다.


    4. JWT의 장점

    JWT가 많이 사용되는 이유는 다음과 같은 장점이 있기 때문입니다:

    1. 효율적이다
      • JWT는 상태를 저장하지 않는(stateless) 방식입니다. 서버가 별도로 세션 데이터를 저장하지 않아도 인증을 처리할 수 있어 서버의 부담이 줄어듭니다.
    2. 안전하다
      • 토큰에 서명이 포함되어 있어, 클라이언트가 전달한 정보가 변조되지 않았는지 확인할 수 있습니다.
    3. 유연하다
      • HTTP 헤더, URL 파라미터, 쿠키 등 다양한 방식으로 토큰을 전달할 수 있습니다.
      • 플랫폼에 상관없이 사용할 수 있어 모바일 앱, 웹 애플리케이션 등 어디서나 활용 가능합니다.

    5. JWT 사용 시 주의할 점

    1. 비밀 키를 안전하게 관리해야 합니다
      • JWT의 서명은 비밀 키를 기반으로 생성되므로, 비밀 키가 유출되면 보안에 심각한 문제가 발생합니다.
    2. HTTPS를 반드시 사용해야 합니다
      • JWT는 암호화된 정보가 아니기 때문에 민감한 정보를 포함해서는 안 됩니다. 데이터 전송 시 중간에 노출될 위험이 있으므로 반드시 HTTPS를 사용해야 합니다.
    3. 유효 기간을 짧게 설정해야 합니다
      • JWT는 한 번 발급되면 클라이언트가 직접 보관하므로, 토큰 유효 기간(exp)을 짧게 설정하여 보안을 강화해야 합니다.

    6. JWT의 사용 사례

    1. 사용자 로그인 인증
      • 로그인 후, JWT를 발급받아 이후 요청마다 사용자의 인증 상태를 확인합니다.
    2. API 인증
      • RESTful API 호출 시, 클라이언트를 인증하기 위한 방법으로 JWT가 자주 사용됩니다.
    3. 권한 부여
      • JWT의 페이로드에 사용자의 권한(role) 정보를 포함하여 권한 관리에 활용할 수 있습니다.

     

    JWT는 사용자가 인증 상태를 유지하는 데 매우 유용하며, 서버의 부담을 줄이고 효율적으로 데이터를 처리할 수 있는 방법입니다.

    다만, 보안상의 취약점을 보완하기 위한 철저한 관리가 필요하다는 점을 꼭 기억하세요.

    JSON Web Token을 제대로 이해하고 활용하면, 더 안전하고 효율적인 시스템을 구축할 수 있습니다.

    반응형