NestJS와 함께하는 자바스크립트 기반 서버리스 아키텍처의 보안 전략

서버리스 아키텍처는 최근 클라우드 환경에서 많이 사용되고 있는 개발 방법론입니다. 이는 서버 관리와 인프라 구축에 대한 부담을 줄여주는 동시에 확장성과 유연성을 제공합니다. NestJS는 자바스크립트를 기반으로 한 프레임워크이며, 서버리스 아키텍처를 구현하기 위한 다양한 기능을 제공합니다. 하지만, 서버리스 환경에서 보안에 대한 고려가 필요하며, 이에 대한 전략을 갖추어야 합니다.

1. API Gateway를 통한 인가와 인증 제어

서버리스 아키텍처에서는 API Gateway를 사용하여 인가와 인증을 통해 요청을 제어할 수 있습니다. API Gateway는 모든 요청을 받아들이고 필요한 사용자 인증, 권한 부여 등의 처리를 수행합니다. NestJS에서는 Passport와 같은 미들웨어를 사용하여 사용자 인증을 구현할 수 있으며, JWT(Json Web Token)를 사용하여 인가 과정을 처리할 수 있습니다. 또한, 사용자의 접근 권한에 대한 제어를 위해 RBAC(Role-Based Access Control)을 구현할 수 있습니다.

// JWT를 사용한 인증 예시

// JWT 토큰 생성 및 발급
const token = jwt.sign({ userId: '1234', role: 'admin' }, secretKey);

// 요청 헤더에 JWT 토큰을 추가
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;

// NestJS에서 JWT 검증을 위한 미들웨어 사용 예시
async function validateUser(payload: any) {
  const user = await userService.findById(payload.userId);
  
  if (user && user.role === 'admin') {
    return user;
  }
  return null;
}

// route guard를 통한 접근 제어 예시
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles('admin')
@Get('/admin/users')
async findAllUsers(): Promise<User[]> {
  return this.userService.findAll();
}

2. 데이터 암호화

서버리스 환경에서는 데이터의 보안을 위해 암호화가 필요합니다. NestJS에서는 bcrypt나 crypto 모듈을 사용하여 데이터를 암호화하고 복호화할 수 있습니다. 민감한 정보나 사용자의 비밀번호와 같은 데이터를 저장할 때에는 반드시 암호화를 해야 합니다.

// 비밀번호 암호화 예시

import bcrypt from 'bcrypt';


const password = 'mysecretpassword';
const hashedPassword = await bcrypt.hash(password, 10);
console.log(hashedPassword);
// Output: $2b$10$uyw/g9z6F2tc3iXAvvScAeEgK2MZ4zMqZt6y6mg0jUFpN33BE5hp6

// 비밀번호 일치 여부 확인 예시
const isMatch = await bcrypt.compare(password, hashedPassword);
console.log(isMatch);
// Output: true

결론

NestJS와 함께하는 자바스크립트 기반 서버리스 아키텍처는 많은 장점을 가지고 있지만, 보안에 대한 고려가 필요합니다. 인가와 인증을 통해 API 접근을 제어하고, 데이터를 암호화하는 등의 보안 전략을 갖추는 것은 반드시 해야 할 일입니다. 이를 통해 안전한 서버리스 환경을 구축할 수 있습니다.

#보안 #서버리스