JSON 웹 토큰이란?
JSON 웹 토큰(JWT)은 JSON 객체로 당사자 간에 정보를 안전하게 전송하기 위한 컴팩트하고 독립적인 방식을 정의하는 개방형 표준( RFC 7519 )입니다. 이 정보는 디지털로 서명되었기 때문에 검증하고 신뢰할 수 있습니다. JWT는 비밀( HMAC 알고리즘 사용) 또는 RSA 또는 ECDSA를 사용하는 공개/비공개 키 쌍을 사용하여 서명할 수 있습니다 .
JWT는 당사자 간의 비밀을 제공하기 위해 암호화될 수 있지만, 서명된 토큰에 초점을 맞출 것입니다. 서명된 토큰은 그 안에 포함된 클레임의 무결성을 확인할 수 있는 반면, 암호화된 토큰은 다른 당사자에게 해당 클레임을 숨깁니다 . 토큰이 공개/비공개 키 쌍을 사용하여 서명되는 경우, 서명은 또한 개인 키를 보유한 당사자만이 서명한 사람임을 증명합니다.
용어정리
JWT - 일반적으로 우리가 부르는 Json Web Token
JWS - JWT 에 Security 가 붙은 보안된 - 검증된 토큰
페이로드 - 값을 넣는 공간인데 두가지가 있음 content , claims 둘다 사용 가능하고
임의의 바이트 배열을 사용하면 Content
정해진 메서드를 통해 만들려면 claims를 사용하면 되는데
둘다 사용하면 에러뜸 - compact()
JSON 웹 토큰의 구조는 무엇입니까?
JSON 웹 토큰은 압축된 형태로 점( .)으로 구분된 세 부분으로 구성되며, 각 부분은 다음과 같습니다.
- 헤더
- 유효 탑재량
- 서명
따라서 JWT는 일반적으로 다음과 같습니다.
xxxxx.yyyyy.zzzzz
각 부분을 나누어 보겠습니다.
헤더
헤더는 일반적으로 두 부분으로 구성됩니다. 토큰 유형인 JWT와 사용되는 서명 알고리즘(HMAC SHA256 또는 RSA 등)입니다.
예를 들어:
{
"alg": "HS256",
"typ": "JWT"
}
그런 다음, 이 JSON은 Base64Url 로 인코딩되어 JWT의 첫 번째 부분을 형성합니다.
유효 탑재량
토큰의 두 번째 부분은 클레임을 포함하는 페이로드입니다. 클레임은 엔터티(일반적으로 사용자)와 추가 데이터에 대한 진술입니다. 클레임에는 registered , public , private 클레임의 세 가지 유형이 있습니다.
- 등록된 클레임 : 이는 필수는 아니지만 권장되는 사전 정의된 클레임 세트로, 유용하고 상호 운용 가능한 클레임 세트를 제공합니다. 일부는 다음과 같습니다. iss (발급자), exp (만료 시간), sub (주체), aud (청중) 및 기타 .
- JWT는 압축적이기 때문에 클레임 이름은 세 글자로만 구성됩니다.
- 공개 클레임 : JWT를 사용하는 사람들이 자유롭게 정의할 수 있습니다. 하지만 충돌을 피하기 위해 IANA JSON 웹 토큰 레지스트리 에서 정의 하거나 충돌 방지 네임스페이스를 포함하는 URI로 정의해야 합니다.
- 개인 청구 : 이는 당사자 간에 정보를 공유하기 위해 작성된 맞춤형 청구로, 이를 사용하는 데 동의한 당사자 간에 정보를 공유하기 위해 작성되며 등록되지 않았 거나 공개된 청구가 아닙니다.
예시 페이로드는 다음과 같습니다.
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
그런 다음 페이로드는 Base64Url 로 인코딩되어 JSON 웹 토큰의 두 번째 부분을 형성합니다.
서명된 토큰의 경우 이 정보는 변조로부터 보호되지만 누구나 읽을 수 있습니다. 암호화되지 않은 한 JWT의 페이로드 또는 헤더 요소에 비밀 정보를 넣지 마십시오.
서명
서명 부분을 만들려면 인코딩된 헤더, 인코딩된 페이로드, 비밀, 헤더에 지정된 알고리즘을 가져와서 서명해야 합니다.
예를 들어 HMAC SHA256 알고리즘을 사용하려는 경우 서명은 다음과 같은 방식으로 생성됩니다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
서명은 메시지가 전송 도중 변경되지 않았는지 확인하는 데 사용되며 개인 키로 서명된 토큰의 경우 JWT를 보낸 사람이 주장한 대로 본인인지 확인할 수도 있습니다.
자바 기준에서 확인할 수 있는 라이브러리
• 모든 Java 7+ JDK 및 Android에서 완벽하게 작동합니다.
모든 표준 JWS 알고리즘을 사용하여 디지털 서명된 컴팩트 JWT(일명 JWS)를 생성, 구문 분석 및 검증:
식별자 서명 알고리즘
HS256 | SHA-256을 사용하는 HMAC |
HS384 | SHA-384를 사용하는 HMAC |
HS512 | SHA-512를 사용하는 HMAC |
ES256 | P-256 및 SHA-256을 사용하는 ECDSA |
ES384 | P-384 및 SHA-384를 사용한 ECDSA |
ES512 | P-521 및 SHA-512를 사용하는 ECDSA |
RS256 | SHA-256을 사용하는 RSASSA-PKCS-v1_5 |
RS384 | SHA-384를 사용하는 RSASSA-PKCS-v1_5 |
RS512 | SHA-512를 사용하는 RSASSA-PKCS-v1_5 |
PS256 | SHA-256 및 SHA-256 1 을 사용하는 RSASSA-PSS |
PS384 | SHA-384 및 SHA-384 1 을 사용하는 RSASSA-PSS |
PS512 | SHA-512 및 SHA-512 1 을 사용하는 MGF1을 사용하는 RSASSA-PSS |
EdDSA | Edwards-curve 디지털 서명 알고리즘 2 |
JWT 클레임
콘텐츠 바이트 배열 대신 JWT 페이로드는 JWT 수신자에 대한 어설션 또는 클레임을 포함할 수 있습니다. 이 경우 페이로드는 JSON Claims이고 ObjectJJWT는 유형 안전 빌더 메서드로 클레임 생성을 지원합니다.
표준 청구
JwtBuilderJWT 사양에 정의된 표준 등록된 클레임 이름에 대한 편리한 빌더 메서드를 제공합니다. 다음과 같습니다 .
- issuer: iss(발급자) 클레임을 설정합니다.
- subject: sub(주제) 클레임을 설정합니다
- audience: aud(청중) 클레임을 설정합니다
- expiration: exp(만료 시간) 클레임을 설정합니다.
- notBefore: nbf(Not Before) 클레임을 설정합니다.
- issuedAt: iat(발행일) 청구를 설정합니다.
- id: jti(JWT ID) 클레임을 설정합니다.
WT 읽기
JWT를 다음과 같이 읽습니다(구문 분석).
- 이 Jwts.parser()메서드를 사용하여 인스턴스를 생성합니다 JwtParserBuilder.
- 서명 되거나 암호화된 JWT를 구문 분석할 것으로 예상되는 경우 선택적으로 keyLocator, verifyWith또는 메서드를 호출합니다 .decryptWith
- 스레드 build()로부터 안전한 .을 생성하고 반환하려면 해당 메서드를 호출합니다 .JwtParserBuilderJwtParser
- parse*기대하는 JWT 유형에 따라 컴팩트 JWT 문자열로 다양한 메서드 중 하나를 호출합니다 .
- parse*구문 분석, 서명 검증 또는 복호화가 실패하는 경우를 대비해 호출을 try/catch 블록으로 묶습니다 .
- 이 Jwts.parser()메서드를 사용하여 인스턴스를 생성합니다 JwtParserBuilder.
- 서명 되거나 암호화된 JWT를 구문 분석할 것으로 예상되는 경우 선택적으로 keyLocator, verifyWith또는 메서드를 호출합니다 .decryptWith
- 스레드 build()로부터 안전한 .을 생성하고 반환하려면 해당 메서드를 호출합니다 .JwtParserBuilderJwtParser
- parse*기대하는 JWT 유형에 따라 컴팩트 JWT 문자열로 다양한 메서드 중 하나를 호출합니다 .
- parse*구문 분석, 서명 검증 또는 복호화가 실패하는 경우를 대비해 호출을 try/catch 블록으로 묶습니다 .
'CS' 카테고리의 다른 글
RSA - 보안 알고리즘에 대해 이해 (0) | 2024.12.08 |
---|---|
HTTP 상태 코드 정리 (1) | 2024.12.06 |
DHCP 동작 과정의 대한 이해 (0) | 2024.11.24 |
DHCP에 대한 개념 공부 해보기 (1) | 2024.11.19 |
lombok AllArgsConstructor를 안쓰는 이유 (0) | 2024.10.08 |