본문 바로가기
Programming

JWT (JSON Web Token)?

by 느리게 걷는 즐거움 2024. 6. 9.
반응형

JWT (JSON Web Token)란 무엇인가?

JWT(JSON Web Token)는 웹 애플리케이션에서 사용자 인증 및 권한 부여를 위해 널리 사용되는 개방형 표준(RFC 7519)입니다. JWT는 JSON 형식의 데이터를 사용하여 정보를 안전하고 압축된 형태로 전송합니다. 주로 인증 목적으로 사용되지만, 정보의 무결성을 보장하는 데에도 유용합니다.

JWT의 구조

JWT는 세 부분으로 구성됩니다: 헤더(Header), 페이로드(Payload), 서명(Signature).

헤더(Header)

헤더는 두 가지 정보를 포함합니다:

- 토큰의 유형(typ): JWT
- 해싱 알고리즘(alg): HMAC SHA256, RSA 등

예시:

   {
     "alg": "HS256",
     "typ": "JWT"
   }
페이로드(Payload)

페이로드는 클레임(Claims)을 포함하며, 클레임은 엔터티(주로 사용자)와 관련된 정보를 전달합니다. 클레임은 세 가지 유형으로 나뉩니다:

- 등록된 클레임(Registered Claims): 토큰의 정보나 규격을 정의 (iss, exp, sub, aud 등)
- 공개 클레임(Public Claims): 충돌 방지를 위해 IANA JSON Web Token Registry에 등록 가능
- 비공개 클레임(Private Claims): 클라이언트와 서버 간에 사용하기 위해 정의

   {
     "sub": "1234567890",
     "name": "John Doe",
     "admin": true
   }
서명(Signature)

서명은 토큰의 무결성을 검증하기 위해 사용됩니다. 헤더와 페이로드를 인코딩한 후, 비밀 키를 사용하여 해싱하여 생성됩니다. 이를 통해 토큰이 변조되지 않았음을 확인할 수 있습니다.

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

JWT의 작동 원리

1. 사용자가 로그인하면 서버는 사용자의 정보를 기반으로 JWT를 생성하여 반환합니다.

2. 클라이언트는 받은 JWT를 저장(주로 로컬 스토리지나 쿠키)하고, 이후의 요청에 JWT를 포함하여 서버에 전달합니다.

3. 서버는 요청을 받을 때마다 JWT를 검증하여 사용자의 인증 상태를 확인합니다.

JWT의 장점

자체 포함(Self-contained): JWT는 필요한 모든 정보를 자체적으로 포함하고 있어 데이터베이스 조회 없이도 사용자를 인증할 수 있습니다.

확장성(Scalability): 중앙 인증 서버 없이도 확장 가능한 아키텍처를 구성할 수 있습니다.

편의성: 클라이언트와 서버 간의 정보 교환을 간단하게 처리할 수 있습니다.

JWT의 보안 고려사항

- 비밀 키 관리: 서명을 검증하기 위한 비밀 키는 안전하게 관리되어야 합니다.
- 만료 시간 설정: 토큰의 유효 기간을 설정하여 만료된 토큰을 사용할 수 없게 해야 합니다.
- HTTPS 사용: 토큰은 민감한 정보를 포함할 수 있으므로 HTTPS를 통해 전송해야 합니다.
- 토큰 무효화: 사용자가 로그아웃하거나 비밀번호를 변경하는 등의 상황에서 토큰을 무효화하는 방법을 고려해야 합니다.

결론

JWT는 현대 웹 애플리케이션에서 인증과 권한 부여를 간편하고 안전하게 처리할 수 있는 강력한 도구입니다. 적절한 보안 조치를 취한다면, JWT를 통해 효율적이고 확장 가능한 인증 시스템을 구축할 수 있습니다. JWT를 사용하여 사용자 인증을 구현하고, 보안과 성능을 모두 충족하는 웹 애플리케이션을 개발해보세요.

반응형

'Programming' 카테고리의 다른 글

Axios?  (1) 2024.06.09
Python의 `classmethod`: 클래스 메서드  (1) 2024.06.09
MongoDB와 SQL: 명령어 비교  (0) 2024.06.09
C++ 람다 함수  (0) 2024.06.07
C++ 벡터(Vector) 초기화  (0) 2024.06.05