Programming

; develop a program

DevStudy

[Web] JWT(Json Web Token)

Clloud_ 2023. 5. 30. 08:08
반응형

이번 포스팅에서는 웹 통신을 위한 간단한 토큰 기반 인증 방식인 JWT(Json Web Token)에 대하여 공부를 해보고자 한다.

 


JWT란

JWT는 "JSON Web Token"의 약어로, 웹 애플리케이션 간에 정보를 안전하게 전송하기 위한 토큰 기반 인증 시스템을 말한다.
JWT는 정보를 디지털로 서명하여 검증 가능하며, 클라이언트와 서버 간의 인증 및 권한 부여를 지원하는 인증 프로토콜이다.

 

 

JWT는 서버와 클라이언트 간에 통신할 때, 인증과 권한 부여를 위해 사용된다.
클라이언트는 로그인 요청을 서버에 보내면, 서버는 유효한 사용자인지 확인하고, JWT를 발행하여 클라이언트에게 전달한다.
클라이언트는 이후 요청 시, JWT를 서버에 함께 보내어 인증 및 권한 부여를 받는다.

 


JWT 구성요소

JWT는 세 가지 구성 요소로 이루어져 있다.

 1. Header

JWT의 Header는 토큰의 유형과 해시 알고리즘 등을 정의한다.
Header는 JSON 형식으로 작성되며 다음과 같은 내용을 포함한다.

const header = {
  alg: 'HS256', // 해싱 알고리즘 (예: HMAC SHA-256)
  typ: 'JWT' 	// 토큰 타입
};

 

2. Payload

JWT의 Payload는 클레임(Claims)이라고 불리는 정보의 조각들을 포함한다.
클레임은 서버와 클라이언트 간에 주고받는 정보를 의미한다.

  • 등록된(Claimed) 클레임: 토큰에 대한 정보를 담고 있다. (예: 발급자, 만료 시간 등)
  • 공개(Public) 클레임: 자유롭게 정의할 수 있는 정보를 담고 있다.
  • 비공개(Private) 클레임: 서버와 클라이언트 간에 협의한 정보를 담고 있다.

Payload는 다음과 같은 JSON 형식으로 작성된다.

const payload = {
  sub: '1234567890', 	// 주제(subject): 토큰의 주제(일반적으로 사용자 식별자)
  name: 'John Doe', 	// 클레임(claim): 사용자의 이름
  iat: 1516239022 	// 클레임(claim): 토큰이 발급된 시간(Unix 타임스탬프)
};

 

3. Signature

JWT의 Signature는 헤더와 페이로드를 합친 후, 비밀키를 사용해 생성된다.
Signature는 생성된 데이터를 누구나 읽을 수 있더라도 변조할 수 없게 해준다.

 

Signature는 다음과 같은 형식으로 작성된다.

const secretKey = 'your-secret-key';
const token = jwt.sign(payload, secretKey, { header });

 


예제

const jwt = require('jsonwebtoken');

// 페이로드(Payload)
const payload = {
  userId: '1234567890',
  username: 'john_doe',
  role: 'admin'
};

// 비밀 키(secret key)
const secretKey = 'your-secret-key';

// JWT 생성
const token = jwt.sign(payload, secretKey);

console.log(token);

// 생성된 토큰을 검증
jwt.verify(token, secretKey, (err, decoded) => {
  if (err) {
    console.error('토큰 검증 실패:', err);
    return;
  }

  console.log('검증된 토큰:', decoded);
});
  • 위의 예시 코드에서는 jwt.sign( ) 함수를 사용하여 JWT를 생성한다.
  • 페이로드에는 사용자 ID, 사용자명, 역할과 같은 정보를 포함할 수 있다.
  • 비밀 키는 토큰을 서명하기 위해 사용되며, 토큰을 검증할 때도 동일한 비밀 키를 사용해야 한다.
  • 생성된 JWT를 검증하기 위해 jwt.verify( ) 함수를 사용한다.
  • 이 함수는 토큰의 유효성을 검증하고, 검증이 성공한 경우 토큰의 내용을 디코딩하여 반환한다.
    만약 검증에 실패하면 에러를 반환한다.

 


반응형

'DevStudy' 카테고리의 다른 글

[Server] API & REST API  (0) 2023.06.04
[Network] 네트워크 연결 스토리지(NAS)  (0) 2023.06.04
[Network] 라우팅(Routing)  (0) 2023.06.01
[Network] 트래픽(Traffic)  (0) 2023.05.30
[Web] 웹뷰(WebView)  (0) 2023.05.30