Express에서 JWT를 사용한 인증 구현
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
백엔드 개발자, API 인증 시스템 구축자
난이도: 중급 (Express.js 기본 지식, Node.js 환경 설정 경험 필요)
핵심 요약
- JWT (JSON Web Token)은 Header, Payload, Signature 3개 구성 요소로 구성된 URL-safe 토큰으로, 인증 정보를 안전하게 전달
- bcryptjs를 통해 비밀번호 해싱 처리 후 DB에 저장 (예:
bcrypt.hash(password, 10)
) - JWT 검증 미들웨어로 보호된 라우트에 접근 시
Authorization: Bearer
헤더 필요 - jsonwebtoken 라이브러리 사용 시
jwt.sign()
과jwt.verify()
함수 필수
섹션별 세부 요약
1. JWT 개요
- JWT 정의: 인증 정보를 안전하게 전달하기 위한 스테이트리스 인증 방식
- 구성 요소:
- Header: 알고리즘 (예: HS256
)
- Payload: 사용자 정보 (예: username
, email
)
- Signature: 토큰의 진위 확인 (예: jsonwebtoken.sign()
)
2. 환경 설정
- 필요한 패키지 설치:
```bash
npm install express jsonwebtoken bcryptjs dotenv
```
.env
파일 생성:
```env
JWT_SECRET=your_jwt_secret_key
```
3. 사용자 등록 기능 구현
- Signup 라우트:
- bcryptjs
로 비밀번호 해싱 처리 (bcrypt.hash(password, 10)
)
- 사용자 정보를 users
배열에 저장 (실제 DB 대체)
- 응답 예시:
```json
{ "message": "User registered successfully" }
```
4. 로그인 및 JWT 발급
- Login 라우트:
- 사용자 존재 여부 검증 후 bcrypt.compare()
로 비밀번호 일치 여부 확인
- JWT 발급 (jsonwebtoken.sign()
):
```javascript
const token = jwt.sign({ username }, process.env.JWT_SECRET, { expiresIn: '1h' });
```
- 응답 예시:
```json
{ "token": "eyJhbGciOi..." }
```
5. 보호된 라우트 설정
- 인증 미들웨어:
- Authorization
헤더에서 Bearer
토큰 추출
- jsonwebtoken.verify()
로 토큰 검증
- 보호된 라우트 예시:
```javascript
app.get('/profile', authenticateToken, (req, res) => {
res.json({ message: Hello, ${req.user.username}!
});
});
```
결론
- 보안 강화:
dotenv
로JWT_SECRET
을 환경 변수로 관리하고,bcryptjs
로 비밀번호 해싱 처리 - 토큰 유효성 검증:
jsonwebtoken.verify()
로 서명 검증 및 만료 시간 확인 - 실무 팁:
Authorization
헤더를 사용할 때Bearer
형식을 반드시 준수하고, 토큰을 암호화하여 전달해야 함