https://docs.nestjs.com/guards
GUARD
- Guard 클레스는
@Injectable()
데코레이팅 된 클레스이다.
- Guard 는
CanActivate
인터페이스를 implement 해야한다.
- Guard 는 single responsibility 만 가진다.
- Guard 는 주어진 요청이 라우트핸들러에 의해 처리되어야 하는지 아닌지를 결정한다. (현재 런타임의 권한, 규칙, ACLs 등에 따라서)
- 이것은 authorization 으로 알려져있기도 하다.
- Authorization 은 전통적인 express 어플리케이션에서, 일반적으로 미들웨어에 의해 핸들링 되었다.
- token validation 과 attaching properties to the
request
가 특정 라우트 컨텍스트나 메타데이터 에 강력하게 결합되지 않았기 때문에, 미들웨어는 좋은 선택이였다.
- 그러나 미들웨어는, 태생적으로 멍청하다.
- 미들웨어는
next()
함수 이후 어떤 핸들러가 실행 될지 모른다.
- 반면에 Guard 는
ExecutionContext
인스턴스에 접근하기 때문에 다음에 어떠한 라우트 핸들러가 실행될지 알고 있다.
- 이것은 exception filters, pipes, interceptors 와 비슷하게 설계되었으며, 당신이 request/response cycle 의 정확히 올바른 포인트의 처리 로직에 개입 할 수 있도록 해준다. 그리고 그것을 선언적으로 할수 있게끔 해준다.
- 이것은 당신의 코드가 좀더 DRY 하고 선언적이게 도와준다.
HINT : Guards 는 모든 미들웨어 다음에 실행되고, 모든 인터셉터와 파이프 이전 에 실행된다. 미들웨어 -> 가드 -> 인터셉터 & 파이프
Authorization guard
- 말했듯이, authorization 은 guard 의 매우 좋은 사용처 이다, 왜냐하면 특정 라우트는 요청자(일반적으로 권한 인증된 유저) 가 충분한 권한이 있을때 사용 할 수 있어야 하기 때문이다. (말진짜 ㅈㄴ 어렵게하는데 그냥 권한 있는 사람만 특정 라우트에 요청할 수 있어야 된다는 뜻)