JWT(JSON Web Token)란?
JWT란 JSON 형식의 데이터를 Base64 인코딩을 통해 문자열로 전달하는 Web Token 입니다. (Web Token이란?)
하지만 JWT는 인터페이스 표준으로 실제 구현은 JWS(JSON Web Signature)와 JWE(JSON Web Encryption)으로 이루어집니다. JWS와 JWE는 Claim을 어떤 방식으로 전달하는지에 대한 차이가 존재합니다. JWS는 데이터의 무결성을 위해 디지털 서명을 사용하는 방식이고, JWE는 데이터의 기밀성을 위해 암호화를 사용하는 방식입니다.
Claim이란?
토큰의 종류에는 일반 토큰과 Claim 토큰이 존재합니다. 일반 토큰은 의미 없는 문자열을 JSON으로 보내는 방식으로 인증에서 사용이 될 수 있지만 정보를 담을 수 없으며, 사실상 세션 방식과 거의 같아 현재는 사용되지 않는 방법입니다. Claim 토큰의 경우 정보 또는 데이터의 속성을 JSON 형식으로 전달하는 방법입니다.
{ "name" : "pandyo", "mail" : "keshupark0113@gmail.com", "isAdmin" : true }
JWS(JSON Web Signature)란?
JWS란 데이터의 무결성을 위해 디지털 서명을 사용하여 JWT를 구현하는 방법입니다. (JWS PHP 구현)
JWS는 헤더와 페이로드, 시그니처 세 가지 파트가 Base64 인코딩을 진행한 후 .(점)을 사이에 두고 합쳐진 문자열 형태로 Base64 디코딩을 통해 누구나 해당 데이터의 내용을 확인할 수 있기 때문에 중요한 정보를 포함하지 않는 것이 좋습니다.
위와 같이 JWT가 전송이 될 경우, 페이로드의 값을 조작할 수 있기 때문에 이를 막고자 시그니처가 존재하는 것입니다. JWT 설계의 결함으로 인해 생기는 취약점과 공격은 JWT Attacks 포스팅에서 확인하실 수 있습니다.
Header
헤더에는 시그니처에 사용되는 알고리즘과 시크릿 키의 정보, 토큰의 타입인 JWT와 같은 내용이 담겨 전송됩니다.
Payload
페이로드에는 토큰을 통해 전달하고자 하는 데이터가 담기게 됩니다. 토큰의 이름, 토큰 발급자, 토큰 만료 시간 등과 같이 권장으로 사용되는 Claim과 사용자가 정의할 수 있는 Claim을 통해 데이터를 표현합니다.
Signature
Header와 Payload의 무결성을 검증하기 위해 사용되는 부분으로, 아래와 같은 과정을 통해 생성됩니다.
- Base64URL 인코딩이 이루어진 Header와 Payload를 .(점)을 사이에 두고 합칩니다.
- 위에서 합쳐진 내용과 서버에서 지정한 시크릿 키를 지정된 알고리즘 해시로 암호화해 줍니다.
위의 과정을 통해 Header와 Payload가 조작되더라도 해커가 알 수 없는 서버의 시크릿 키를 함께 사용하였기에 토큰의 무결성을 검증할 수 있는 것입니다. (RSA 방식의 알고리즘을 사용할 경우 공개 키에 맞는 개인 키로 서명을 해야 하기 때문에 이를 통해서도 보안이 강화)
때문에 Signature 검증을 철저히 해야 인증 우회 또는 권한 상승과 같은 피해로부터 보호될 수 있습니다.
JWE(JSON Web Encryption)란?
JWE란 데이터의 기밀성을 위해 암호화를 사용하여 JWT를 구현하는 방법입니다.
JWE의 구조
다섯 개의 base64url로 인코딩 된 부분으로 구성되며 각 부분은 .(점)으로 구분됩니다.
- 헤더 : 암호화 알고리즘과 키 관리 알고리즘 등의 메타데이터
- 암호화된 키 : 콘텐츠 암호화 키를 수신자의 공개 키 등으로 암호화한 결과
- 초기화 벡터 : 블록 암호화 알고리즘에서 사용되는 초기 벡터
- 암호문 : 실제로 암호화된 페이로드
- 인증 태그 : 인증된 암호화 방식을 사용할 때 생성되는 태그로, 데이터의 무결성을 검증
JWE에 대한 내용은 추후 포스팅에서 자세히 다루도록 하겠습니다.
'Web > 개발' 카테고리의 다른 글
JWT(JSON Web Token) PHP 로그인 구현 (0) | 2024.11.16 |
---|---|
Web Token이란? (1) | 2024.11.15 |
Web Template Engine이란? (0) | 2024.10.24 |
API란? (0) | 2024.09.19 |