JWT는 json web token의 약자로, 당사자 간에 정보를 JSON 개체로 전송하는 데 사용되는 개방형 표준입니다. 이는 컴팩트하고 URL 안전하며 인증 및 정보 교환을 위해 웹 애플리케이션에서 광범위하게 사용됩니다.
JWT는 키와 비밀을 사용하여 디지털 서명됩니다. 사용자를 인증하기 위해 이러한 키와 서명으로 JWT를 확인합니다. 대부분의 웹 시스템은 JWT를 사용하여 사용자에게 특정 리소스에 대한 액세스 권한을 부여합니다.
JWT에는 헤더, 페이로드, 서명이라는 세 가지 주요 구성요소가 있습니다. 토큰을 생성할 때 헤더와 페이로드를 전달한 다음 토큰이 서명을 생성합니다.
Headre - JWT의 헤더에는 토큰에 대한 메타데이터가 포함되어 있습니다. 여기에는 alg, typ 및 kid의 세 가지 값이 포함됩니다. alg는 토큰 서명에 사용되는 알고리즘을 지정하고, typ는 토큰 유형을 나타내며, kid는 키를 식별하는 데 사용되는 선택적 매개변수입니다. 어린이를 포함할지 여부는 사용 사례에 따라 다릅니다.
{ "alg": "RS256", // allow [HS256,RS256,ES256] "typ": "JWT", // Specific Type Of token "kid": "12345" // Used to indicate which key was used to sign the JWT. This is particularly useful when multiple keys are in use }
페이로드 - 페이로드에서는 일부 사용자 정의 데이터를 지정하며 대부분 사용자 ID 및 역할과 같은 사용자별 데이터를 페이로드에 추가합니다.
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
서명 - 서명은 헤더와 페이로드를 비밀 키(HS256의 경우)로 인코딩하거나 개인 키(RSA의 경우)로 서명한 후 결과를 해싱하여 생성됩니다. 이 서명은 토큰을 확인하는 데 사용됩니다.
논의한 것처럼 JWT에는 헤더, 페이로드, 서명이라는 세 가지 구성 요소가 있습니다. 우리는 헤더와 페이로드를 제공하고, 여기서 서명이 생성됩니다. 이러한 모든 구성 요소를 결합한 후 토큰을 만듭니다.
// Header Encoding Base64Url Encode({ "alg": "RS256", "typ": "JWT" }) → eyJhbGciOiAiUlMyNTYiLCAidHlwIjogIkpXVCJ9 // Payload Encoding Base64Url Encode({ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }) → eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE1MTYyMzkwMjJ9 // Concatenate Encoded header and payload ConcatenatedHash = Base64Url Encode(Header) + "." + Base64Url Encode(Payload) //Create Signature Hash = SHA-256(ConcatenatedHash) Signature = RSA Sign(Hash with Private Key) or HS256 Sign(Hash with secrate) // Create Token Token = Base64UrlEncode(Header) +"."+ Base64UrlEncode(Payload) +"."+ Signature
따라서 JWT를 생성하는 과정은 다음과 같습니다. 페이로드와 헤더를 인코딩한 후 여기서 서명을 생성합니다.
앞서 JWT를 만드는 방법에 대해 논의했습니다. 이제 JWT를 확인하는 방법에 대해 논의해 보겠습니다. 확인 프로세스는 기본적으로 토큰 생성의 역순입니다. 먼저 비밀 키나 공개 키를 사용하여 토큰을 해독합니다. 그런 다음 헤더와 페이로드를 연결하여 서명을 생성합니다. 생성된 해시가 서명과 일치하면 토큰이 유효합니다. 그렇지 않으면 유효하지 않습니다.
// Token we recive in this formate Token = Base64UrlEncode(Header) +"."+ Base64UrlEncode(Payload) +"."+ Signature // Decrypt Signature TokenHash = RSA Decrypt(Hash with Public Key) or HS256 Sign(Hash with secrate) // Generate Hash From Encoded Header and Payload Hash = SHA-256(Base64UrlEncode(Header) +"."+ Base64UrlEncode(Payload)) // Compare Hash if(TokenHash == Hash) "Valid" else "Not Valid"
JWT는 위의 모든 이점을 제공하므로 사용자에게 권한을 부여하는 대부분의 인증 메커니즘에서 널리 사용됩니다. 또한 JWT는 DPoP 등 다양한 인증 기술과 함께 사용할 수 있습니다.
코드에서 JWT를 사용하기 위해 jsonwebtoken npm 패키지를 활용합니다. JWT 작업에는 비밀 키를 사용하는 간단한 방법과 키 쌍 방법(공개 및 개인 키 사용)의 두 가지 방법이 있습니다.
import jwt from 'jsonwebtoken'; // Define the type for the payload interface Payload { userId: number; username: string; } // Secret key for signing the JWT const secretKey: string = 'your-very-secure-secret'; // Payload to be included in the JWT const payload: Payload = { userId: 123, username: 'exampleUser' }; // Sign the JWT const token: string = jwt.sign(payload, secretKey, { expiresIn: '1h' }); console.log('Generated Token:', token);
import jwt from 'jsonwebtoken'; // Secret key for signing the JWT const secretKey: string = 'your-very-secure-secret'; // Verify the JWT try { const decoded = jwt.verify(token, secretKey) as Payload; console.log('Decoded Payload:', decoded); } catch (err) { console.error('Token verification failed:', (err as Error).message); }
import * as jwt from 'jsonwebtoken'; import { readFileSync } from 'fs'; // Load your RSA private key const privateKey = readFileSync('private_key.pem', 'utf8'); // Define your payload const payload = { sub: '1234567890', name: 'John Doe', iat: Math.floor(Date.now() / 1000) // Issued at }; // Define JWT sign options const signOptions: jwt.SignOptions = { algorithm: 'RS256', expiresIn: '1h' // Token expiration time }; // Generate the JWT const token = jwt.sign(payload, privateKey, signOptions); console.log('Generated JWT:', token);
import * as jwt from 'jsonwebtoken'; import { readFileSync } from 'fs'; // Load your RSA public key const publicKey = readFileSync('public_key.pem', 'utf8'); // Define JWT verify options const verifyOptions: jwt.VerifyOptions = { algorithms: ['RS256'] // Specify the algorithm used }; try { // Verify the JWT const decoded = jwt.verify(token, publicKey, verifyOptions) as jwt.JwtPayload; console.log('Decoded Payload:', decoded); } catch (error) { console.error('Error verifying token:', error); }
요약하면 JSON 웹 토큰(JWT)은 압축된 형식을 사용하여 당사자 간에 정보를 안전하게 전송합니다. RSA 서명 및 확인에는 서명에 개인 키를 사용하고 확인에 공개 키를 사용하는 작업이 포함됩니다. TypeScript 예제는 개인 RSA 키로 JWT를 생성하고 공개 RSA 키로 이를 확인하여 안전한 토큰 기반 인증과 데이터 무결성을 보장하는 방법을 보여줍니다.
위 내용은 JWT 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!