JWT란 무엇인가?
JSON Web Token (JWT) 는 JSON 기반의 토큰으로, 정보를 안전하고 간결하게 주고받기 위한 기술입니다. JWT는 주로 인증(Authentication) 과 권한 부여(Authorization) 에 사용되며, HTTP 헤더, URI 쿼리 파라미터 등 공간이 제한된 환경에서도 쉽게 활용할 수 있습니다.
인증/인가를 위한 방식으로 다양한 선택지가 있지만, 매번 인증/인가를 위해 DB에 직접 연결(DB Connect)을 수행하면 성능 문제가 발생할 수 있습니다. 이를 해결하기 위해 서버가 사용자의 인증 상태를 유지할 수 있는 토큰 방식이 도입되었고, 그중 하나로 널리 사용되는 것이 JWT 방식의 인증/인가입니다.
그럼 우리는 과연 JWT에 대해서 어느정도까지 알고 사용하고 있을까요?
JWT의 구조
JWT는 세 가지 주요 부분으로 구성됩니다:
- Header (헤더): 토큰의 메타데이터를 포함. (e.g., 서명 알고리즘, 타입)
- Payload (페이로드): 전달할 데이터를 담고 있는 JSON 객체.
- Signature (서명): 데이터의 무결성을 보장하기 위한 서명 값.
JWT는 다음과 같은 형식으로 표현됩니다:
Header.Payload.Signature
예시:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWS와 JWE
JWT는 크게 두 가지 형태로 사용됩니다: JWS (JSON Web Signature) 와 JWE (JSON Web Encryption)
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를 결합하면 기밀성과 무결성을 모두 보장할 수 있습니다. 과정은 다음과 같습니다:
- JWS 생성: 데이터를 서명하여 무결성을 보장.
- JWE 암호화: 생성된 JWS를 암호화하여 기밀성을 추가.
결과적으로 암호화된 데이터의 무결성까지 확인할 수 있는 안전한 토큰이 만들어집니다.
JWT의 장점
-
간결성 (Compact):
- Base64URL로 인코딩되어 HTTP 헤더나 URI에서도 쉽게 사용 가능.
-
독립성 (Self-contained):
- 필요한 정보를 자체적으로 포함하므로 서버 측 세션 저장소가 불필요.
-
확장성 (Scalable):
- 표준 클레임과 커스텀 클레임을 조합하여 다양한 요구를 충족 가능.
보안 모범 사례
JWT를 안전하게 사용하기 위해 다음을 권장합니다:
-
민감한 정보 저장 금지:
- JWT는 디코딩이 쉬우므로 비밀번호와 같은 민감한 데이터는 저장하지 말 것.
-
HttpOnly 쿠키 사용:
- XSS 공격을 방지하기 위해 브라우저에서 접근 불가능한 쿠키에 저장.
-
CSRF 방지:
- 쿠키로 JWT를 사용할 경우 CSRF 방어를 반드시 적용.
-
강력한 키 사용:
- 서명과 암호화를 위한 키는 충분히 길고 복잡해야 함.
-
짧은 만료 시간:
- 토큰의 유효 기간을 짧게 설정하여 리스크를 최소화.
마무리
JWT는 간결하고 강력한 인증 및 권한 부여 도구로, JWS와 JWE를 통해 다양한 보안 요구를 충족할 수 있습니다. 그러나 사용 목적에 맞는 적절한 구현과 보안 설정이 필요합니다. 이번 글에서 소개한 내용을 바탕으로 JWT를 더 안전하게 활용할 수 있길 바랍니다.
궁금한 점이나 추가적인 논의가 필요하다면 댓글로 남겨주세요!