개발자doc 2024. 7. 11. 18:59
목차
1. 가드란?
2. 왜 서비스로직에서 하지 않을까?
3. 사용법
1. 가드란?

▶ 인터셉터나 파이프 전에 권한 인증을 진행하기 위한 클래스

 

2. 목적이 뭘까?

웹 애플리케이션을 구축할 때 많은 개발자가 MVC패턴을 사용하여 로직을 나눈다. 그 중 데이터 검증에 관한 작업을 하는 곳은 Service인데 왜 굳이 가드를 나누어 실행을 할까? 그 이유를 알아보자. 

 

1. 관심사를 분리

▶ 인증과 권한 부여를 처리하는데 특화되어있는 가드를 분리하여 서비스 빈은 비즈니스로직에 집중할 수 있다. 

 

2. 재사용성

▶ 인증 로직은 하나의 서비스 로직이 아닌 다른 로직에서도 사용할 수 있기 때문에 분리하여 사용하면 코드의 중복을 줄일 수 있다.

 

3. 요청 전 처리

▶ 요청이 컨트롤러에 도달하기 전 실행되기에 불필요하게 리소스가 사용되는 것을 방지할 수 있다.

 

4. 전역 적용 가능

▶ 모든 요청에 일관된 인증 로직을 실행 시킬 수 있다.

3. 사용법
// 가드.ts
// CanActive는 
export class Auth implements CanActive{
    canActive(context:ExcutionContext){
        // 인증로직
    }
}

// 인증로직을 사용하는 controller
@UseGuards(Auth) // 가드를 사용하기 위한 데코레이터
@Controller()
export class Controller {
    
} 

// ex)
// guard.ts
@Injectable()
export class Auth implements CanActive{
    catActive(context:ExcutionContext):boolean{
         const {cookie:{token}} = context.switchToHttp().getRequest();
         if(!token)
              throw new UnauthorizedException("token is not exist");
         jwt.verify(token);
         return true;
    }
}

// controller.ts
@Controller()
export class Controller{
    @Get()
    findAll(){
        // 조회
    }
    @UseGuard(Auth)
    @Post("create")
    createPost(@Body() body:DTO){
        // 데이터 추가로직
    }
}

토큰이 없다면 post 요청이 왔을 때 권한인증을 하지못해 메서드를 실행하지 못한다.

 

이 처럼 가드를 생성하여 권한인증에 필요한 요청에 대해 인증 정보가 포함되어 체크를 할 수 있다.