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을 제대로 이해하고 활용하면, 더 안전하고 효율적인 시스템을 구축할 수 있습니다.

반응형