JWT 이해

王林
풀어 주다: 2024-08-08 13:46:24
원래의
721명이 탐색했습니다.

JWT란 무엇인가요?

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를 생성하는 과정은 다음과 같습니다. 페이로드와 헤더를 인코딩한 후 여기서 서명을 생성합니다.

Understanding the JWT

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 사용의 이점

  1. 보안 - JWT는 디지털 서명되어 데이터의 무결성과 신뢰성을 보장합니다
  2. 컴팩트 - JWT는 크기가 작아 네트워크를 통해 전송하는 데 효율적입니다.
  3. 자체 포함 - JWT에는 사용자에 대해 필요한 모든 정보가 포함되어 있어 데이터베이스를 여러 번 쿼리할 필요성이 줄어듭니다.

JWT는 위의 모든 이점을 제공하므로 사용자에게 권한을 부여하는 대부분의 인증 메커니즘에서 널리 사용됩니다. 또한 JWT는 DPoP 등 다양한 인증 기술과 함께 사용할 수 있습니다.

코드에서 JWT를 사용하는 방법

코드에서 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);
}
로그인 후 복사

KeyPair 방법 사용

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿