JWT 구조 및 인증 절차

방울·2024년 5월 14일
0

웹 어플리케이션을 개발하다 보면, 사용자의 로그인 상태를 관리하는 것은 필수적인 요소 중 하나이다. 이를 위해 쿠키, 세션, JWT(JSON Web Token)같은 다양한 방법을 활용할 수 있다. 각각의 방법은 장단점을 가지고 있으며, 오늘은 JWT를 중심으로 개념과 활용 방법을 알아보려고 한다.


로그인 세션에서 인증/인가의 차이
사용자가 로그인을 하면 서버는 해당 사용자의 로그인 세션을 생성하게 된다. 이 세션은 사용자가 로그인 상태를 유지할 수 있게 해주며, 세션이 만료되면 사용자는 다시 로그인을 해야한다.

인증(Authentication) vs 인가(Authoriztion)

  • 인증: 사용자가 누구인지 확인하는 과정이다. 예를 들어, 쇼핑몰에서 장바구니에 상품을 담거나 구매할 때 로그인이 필요하다.
  • 인가: 인증된 사용자가 특정 자원에 접근할 수 있는 권한을 가지고 있는지 확인하는 과정이다. 예를 들어, 관리자 페이지는 일반 사용자가 아닌 관리자만 접근할 수 있다.

쿠키 vs 세션

Cookie & Session 개념

쿠키

로그인 시 서버는 사용자에게 쿠키를 발급하고, 이후 사용자와 서버 간의 통신 시 이 쿠키를 이용해 사용자를 식별한다.(쿠키를 클라이언트와 서버가 주고받으며 사용자 인증 유지)

  • 장점: 서버의 저장 공간을 절약하고, HTTP의 Stateless 특성을 유지할 수 있다.
  • 단점: 보안에 취약하다.

세션

로그인 시 서버가 정보를 저장하고, 그에 대한 식별 번호를 클라이언트에게 전달한다.

  • 장점: 보안성이 비교적 좋다.
  • 단점: 서버의 저장 공간을 사용하며, HTTP의 Stateless 특성을 유지하지 못한다.

JWT(JSON Web Token)

jwt.io

웹 표준으로, 두 개체 사이에서 JSON 객체를 사용하여 가볍고 자가수용적인(self-contained) 방식으로 정보를 안전하게 전송하기 위해 설계되었다. 주로 사용자 인증 및 정보 교환에 사용된다.

cf. 자가수용적(self-contained) - 그 자체로 필요한 모든 정보를 포함하고 있다는 의미로, 토큰을 검증하고 사용자를 인증하는 데 필요한 정보가 토큰 안에 이미 포함되어 있어 별도의 정보 조회 과정 없이도 토큰만으로 사용자 인증 및 권한 부여 동의 처리가 가능하다는 것을 의미.

JWT 구조

구조는 세 부분으로 나누어진다. 헤더(Header), 페이로드(Payload), 시그니처(Signature).

  1. 헤더(Header)
    헤더는 토큰의 타입(주로 JWT)과 사용된 해싱 알고리즘(예: HMAC SHA256 또는 RSA)을 포함하는 두 부분으로 구성된다. 이는 JSON 형식으로 인코딩되며, 이후 Base64Url로 인코딩되어 JWT의 첫 번째 부분을 형성한다.
{
  "alg": "HS256",
  "typ": "JWT"
}
  1. 페이로드(Payload)
    페이로드는 토큰에 포함될 클레임(claim)을 담고 있다. 클레임은 엔티티(주로 사용자 정보)와 추가 데이터에 대한 내용이다. 페이로드도 JSON 형식으로 인코딩되며 Base64Url로 인코딩되어 JWT의 두 번째 부분을 형성한다.
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
  1. 시그니처(Signature)
    시그니처는 토큰의 무결성과 정보의 검증을 보장하기 위해 생성된다. 헤더의 인코딩된 문자열, 페이로드의 인코딩된 문자열, 그리고 비밀키를 사용하여 헤더에서 지정한 알고리즘으로 해싱된 후 생성된다. 이 시그니처는 Base64Url로 인코딩되어 JWT의 세 번째 부분을 형성한다.

JWT는 이 세 부분을 점(.)을 사용하여 연결하여 하나의 문자열로 만든다. JWT를 사용하면 사용자 인증 정보를 안전하게 전송할 수 있고, 서버는 해당 토큰이 변조되지 않았음을 검증할 수 있다.


JWT 인증/인가 절차

  1. 클라이언트는 로그인 요청을 한다.
  2. 서버는 로그인이 성공하면 JWT를 발급한다.
  3. 클라이언트는 이후 요청 시 JWT를 Header에 포함시켜 서버에 전송한다.
  4. 서버는 JWT의 서명을 확인하고, 요청에 대한 응답을 한다. (서명이 일치하지 않는 경우, 403 권한 없음 오류를 반환한다.)

JWT 구현

Node.js 환경에서 jsonwebtokendotenv 패키지를 활용하여 JWT 기반 인증 시스템을 구축할 수 있다.
1. npm install jsonwebtoken dotenv로 필요한 패키지 설치
2. .env 파일에 환경변수(예: PRIVATE_KEY)를 설정하여 외부에 노출되면 안 되는 값 관리
3. jsonwebtoken 패키지를 사용하여 JWT를 발행하고 검증하는 로직 구현

var jwt=require('jsonwebtoken');
var dotenv=require('dotenv');

dotenv.config();

// JWT 발행
var token = jwt.sign({foo:'bar'}, process.env.PRIVATE_KEY);
console.log(token);

// JWT 검증
var decoded = jwt.verify(token, process.env.PRIVATE_KEY);
console.log(decoded.foo); // 'bar'

환경 변수 파일(.env)
환경 변수 파일은 중요한 설정 값들을 외부에 유출되지 않도록 관리하기 위한 파일이다. 예를 들어, 데이터베이스 계정 정보, 비밀키 등이 이에 해당한다.


🔑

profile
방울방울

0개의 댓글