웹 어플리케이션을 개발하다 보면, 사용자의 로그인 상태를 관리하는 것은 필수적인 요소 중 하나이다. 이를 위해 쿠키, 세션, JWT(JSON Web Token)같은 다양한 방법을 활용할 수 있다. 각각의 방법은 장단점을 가지고 있으며, 오늘은 JWT를 중심으로 개념과 활용 방법을 알아보려고 한다.
로그인 세션에서 인증/인가의 차이
사용자가 로그인을 하면 서버는 해당 사용자의 로그인 세션을 생성하게 된다. 이 세션은 사용자가 로그인 상태를 유지할 수 있게 해주며, 세션이 만료되면 사용자는 다시 로그인을 해야한다.
로그인 시 서버는 사용자에게 쿠키를 발급하고, 이후 사용자와 서버 간의 통신 시 이 쿠키를 이용해 사용자를 식별한다.(쿠키를 클라이언트와 서버가 주고받으며 사용자 인증 유지)
로그인 시 서버가 정보를 저장하고, 그에 대한 식별 번호를 클라이언트에게 전달한다.
웹 표준으로, 두 개체 사이에서 JSON 객체를 사용하여 가볍고 자가수용적인(self-contained) 방식으로 정보를 안전하게 전송하기 위해 설계되었다. 주로 사용자 인증 및 정보 교환에 사용된다.
cf. 자가수용적(self-contained) - 그 자체로 필요한 모든 정보를 포함하고 있다는 의미로, 토큰을 검증하고 사용자를 인증하는 데 필요한 정보가 토큰 안에 이미 포함되어 있어 별도의 정보 조회 과정 없이도 토큰만으로 사용자 인증 및 권한 부여 동의 처리가 가능하다는 것을 의미.
구조는 세 부분으로 나누어진다. 헤더(Header), 페이로드(Payload), 시그니처(Signature).
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
JWT는 이 세 부분을 점(.)을 사용하여 연결하여 하나의 문자열로 만든다. JWT를 사용하면 사용자 인증 정보를 안전하게 전송할 수 있고, 서버는 해당 토큰이 변조되지 않았음을 검증할 수 있다.
Node.js 환경에서 jsonwebtoken과 dotenv 패키지를 활용하여 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)
환경 변수 파일은 중요한 설정 값들을 외부에 유출되지 않도록 관리하기 위한 파일이다. 예를 들어, 데이터베이스 계정 정보, 비밀키 등이 이에 해당한다.
🔑