nestjs 인증 적용

윤종성·2025년 6월 9일
0

실무

목록 보기
5/5

아주 좋은 질문이야.
지금 상황을 정리해보면,

  • MongoDB에 사용자 정보가 저장되어 있음

  • 프론트에서 자신의 MongoDB _id를 직접 전달해서 사용자 정보를 조회 중

  • 문제점:

    • 만약 다른 사용자의 id(= ObjectId)를 탈취하면,
      그대로 요청하면 남의 정보도 볼 수 있음
    • 즉, “인증(누가 요청했는지)”과 “인가(그 사람이 그 정보를 볼 권리가 있는지)”가 분리 안 돼 있음

✅ 안전하게 만들려면 어떻게 해야 할까?

핵심 원칙

로그인한 사용자는 반드시 자기 정보만 볼 수 있어야 한다.
(id를 아무리 바꿔도, 내 계정이 아닌 건 못 보게)”


1. API에서 id를 쿼리로 절대 받지 않는다 (or, 받아도 무시한다)

  • id를 프론트에서 넘기는 방식 X
  • 서버에서 JWT나 세션 등 인증 토큰을 파싱해서
    “지금 로그인한 사용자”의 id만 사용

💡 예시: NestJS에서 JWT + Passport 사용

1) JWT 인증 설정 (예시)

// user.controller.ts
@UseGuards(JwtAuthGuard)
@Get('me')
async getMe(@Request() req) {
  // req.user는 JWT에서 추출한 유저 정보 (보통 { userId, email, ... })
  const user = await this.userService.findById(req.user.userId);
  // 여기서 필요한 정보만 골라서 반환 (예: DTO로 필터링)
  return new UserResponseDto(user);
}

2) 프론트엔드는 별도의 id 없이 /me 엔드포인트만 호출

// fetch('/api/user/me', { headers: { Authorization: 'Bearer ...' } })
  • 브라우저에서 id를 전달할 필요 없음
  • JWT에서 서버가 알아서 id 추출

✅ 장점

  • id 탈취해도 소용 없음 (내 JWT 토큰이 아니면 내 정보밖에 못 봄)

  • API 구조도 심플:

    • /user/me 또는 /me 같은 경로 사용
    • params, query에 id 없음

2. 만약 id를 꼭 받는 구조라면? (권장하지 않음)

  • 추가로 “인가” 체크가 필요함
    → 즉, 조회 요청의 id가 현재 로그인한 사용자와 같은지 비교
    → 아니면 403 Forbidden 에러 반환
@Get(':id')
@UseGuards(JwtAuthGuard)
async getUser(@Request() req, @Param('id') id: string) {
  if (id !== req.user.userId) {
    throw new ForbiddenException('본인 정보만 조회 가능');
  }
  return new UserResponseDto(await this.userService.findById(id));
}
  • 하지만 이 방식은 API 오남용 가능성 높으니
    최대한 “/me” 구조로 통일하는 걸 추천

3. 반환 데이터도 최소화 (보안 강화)

  • 항상 DTO로 반환할 필드를 제한
  • password, hashedPassword, 민감 데이터는 제외
export class UserResponseDto {
  readonly email: string;
  readonly name: string;
  // ... 필요한 필드만
}

🔥 핵심만 요약

  • API에서 id(혹은 ObjectId)를 쿼리로 직접 받지 않는다
  • 인증(로그인)은 반드시 JWT/세션 기반으로 하고,
    내부적으로 서버가 현재 유저의 id를 식별해서 조회
  • 필요한 정보만 DTO로 가공해서 응답

💡 추가 팁

  • 가능하다면 “/user/me”만 열고, “/user/\:id” 같은 엔드포인트는 아예 막는 게 더 안전
  • 관리자(어드민) 기능은 별도 인증/인가 체계로 분리

실제 NestJS + Mongoose + Passport(JWT) 조합 코드 샘플이 더 필요하면 추가로 보여줄 수 있어!
원해?

profile
알을 깬 개발자

0개의 댓글