JWT란? 동작 원리와 사용 방법 완벽 정리
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가 많이 사용되는 이유는 다음과 같은 장점이 있기 때문입니다:
- 효율적이다
- JWT는 상태를 저장하지 않는(stateless) 방식입니다. 서버가 별도로 세션 데이터를 저장하지 않아도 인증을 처리할 수 있어 서버의 부담이 줄어듭니다.
- 안전하다
- 토큰에 서명이 포함되어 있어, 클라이언트가 전달한 정보가 변조되지 않았는지 확인할 수 있습니다.
- 유연하다
- HTTP 헤더, URL 파라미터, 쿠키 등 다양한 방식으로 토큰을 전달할 수 있습니다.
- 플랫폼에 상관없이 사용할 수 있어 모바일 앱, 웹 애플리케이션 등 어디서나 활용 가능합니다.
5. JWT 사용 시 주의할 점
- 비밀 키를 안전하게 관리해야 합니다
- JWT의 서명은 비밀 키를 기반으로 생성되므로, 비밀 키가 유출되면 보안에 심각한 문제가 발생합니다.
- HTTPS를 반드시 사용해야 합니다
- JWT는 암호화된 정보가 아니기 때문에 민감한 정보를 포함해서는 안 됩니다. 데이터 전송 시 중간에 노출될 위험이 있으므로 반드시 HTTPS를 사용해야 합니다.
- 유효 기간을 짧게 설정해야 합니다
- JWT는 한 번 발급되면 클라이언트가 직접 보관하므로, 토큰 유효 기간(exp)을 짧게 설정하여 보안을 강화해야 합니다.
6. JWT의 사용 사례
- 사용자 로그인 인증
- 로그인 후, JWT를 발급받아 이후 요청마다 사용자의 인증 상태를 확인합니다.
- API 인증
- RESTful API 호출 시, 클라이언트를 인증하기 위한 방법으로 JWT가 자주 사용됩니다.
- 권한 부여
- JWT의 페이로드에 사용자의 권한(role) 정보를 포함하여 권한 관리에 활용할 수 있습니다.
JWT는 사용자가 인증 상태를 유지하는 데 매우 유용하며, 서버의 부담을 줄이고 효율적으로 데이터를 처리할 수 있는 방법입니다.
다만, 보안상의 취약점을 보완하기 위한 철저한 관리가 필요하다는 점을 꼭 기억하세요.
JSON Web Token을 제대로 이해하고 활용하면, 더 안전하고 효율적인 시스템을 구축할 수 있습니다.