Guard에 관한 내용을 번역과 동시에 제 생각을 넣은 글입니다. 더 정확한 사실을 알고 싶다면 해당 링크를 방문해 주세요. 번역 시작하겠습니다.
Guard란? What is Guard?
특정 라우트나 컨트롤러 메서드에 대한 접근을 제어하는 역할을 합니다. 주로 사용자의 인증 및 권한 검사를 위해 사용되며, 요청이 해당 라우트로 진행될 수 있는지 결정합니다.
Guard는 @Injectable 데코레이터로 이루어진 클래스입니다. 그리고 canActivate 인터페이스로 구현되어 있습니다. Injectable로 구성되어 있다는 것은 주입할 수 있는 클래스라는 것을 의미합니다. 그리고 CanActivate 인터페이스를 구현한다는 의미는 해당 클래스가 Guard로 사용되다는 것을 의미합니다.
CanActivate 인터페이스의 역할
canActivate 인터페이스를 구현하는 클래스는 canActivate라는 메서드를 정의해야 합니다. 이 메서드는 라우트 핸들러가 실행되기 전에 호출되며, 요청이 해당 라우트로 진행될 수 있는지 판단합니다. 예를 들어서, 헤더에 토큰이 존재하는지 확인해 다음 라우트로 진행될 수 있는지 검사하는 코드를 작성합니다.
Guard가 갖고 있는 단 하나의 책임.
Guard는 인증이라는 딱 하나의 책임만을 갖고있습니다. 인증에 관한 역할만 담당하고 있는 것입니다. Guard들은 런타임에 존재하는 특정 조건인 허가, 역할, ACL에 따라 라우트 핸들러에서 처리할지 않을지 결정짓는 것을 합니다.
원래 Express에선 미들웨어가 다 해줬는데?
맞습니다. 왜냐하면, 토큰 검증이나 요청 객체에 프로퍼티를 추가하는 것과 같은 것은 다음에 진행해야할 특정 라우트와 직접적으로 연관되어 있는 것이 아니기 때문입니다. 예를 들어서 토큰 검증이나 사용자 인증 정보를 확인하고 이를 Request 객체에 추가하는 작업은 어떤 라우트에 접근하든 동일하게 적용되기 때문입니다. 그래서 미들웨어에서 당연하게도 해당 작업을 진행하는 것이 맞습니다.
하지만, 미들웨어의 역할을 해내고 다음 단계로 넘어갈때 next 함수가 호출되는데, 어떤 라우트 핸들러가 실행될지 미들웨어에서는 알 수가 없습니다. 그래서 미들웨어가 모든 요청에 대해 동일한 방식으로 작동하게 됩니다. 즉, 미들웨어는 다음에 어떤 작업이 수행될지 모른 채 자신이 해야 할 작업만 수행하는 단순한 역할을 할 뿐입니다.
예를 들어, /admin, /user는 특화된 정보에 맞춰 다음 라우트를 진행합니다. 하지만, 이러한 특정 정보를 모르고 있기에 라우트별로 다른 처리를 할 수 없습니다. 그리고 미들웨어는 모든 요청에 대해 동일하게 작동해야 하기 때문에 특정 라우트의 요구사항을 반영할 수 없습니다. 그래서, 어떤 라우트는 특정 인증이 필요하고 다른 라우트는 필요하지 않은 경우에는 미들웨어는 모든 요청에 대해 동일한 인증을 수행하려고 합니다.
이때, 특정 라우트에서 필요하지 않은 인증을 시도하게 되면서 불필요한 작업을 하게 됩니다. 그래서 이러한 불편함을 안고 있는 Express였습니다.
그래서 Nest에선 다 해주잖아, Guard가
반면에, Guards는 요청이 해당 라우트로 전달되기 전에 해당 라우트의 실행 컨텍스트(Execution Context)를 알 수 있습니다. 예를 들어, Guard는 어떤 라우트로의 접근을 허용할지 여부를 결정할 수 있습니다. 그리고 특정 라우트에서만 필요한 인증 작업을 수행할 수도 있습니다. 이를 통해 Nest js는 더 세밀하고 라우트에 특화된 방식으로 인증을 처리할 수 있게 됩니다.
또한, Guard는 Exception Filter, Pipes, Interceptors 같이 Request/Response 주기의 정확한 지점에 처리 로직을 삽입하고 바로 처리할 수 있도록 디자인되어 있습니다. 이는 우리 코드를 간단명료하게 유지할 수 있게 도움을 줍니다.
해당 글에서는 인증이라고 글을 작성했지만, 허가가 더 맞는 말이라고 생각이 됩니다. 그래서 추후에 더 알아본 후 허가로 변환을 하겠습니다.
더 읽어보면 좋은 자료들
'Project > Nest.js' 카테고리의 다른 글
[번역] Pipes란 무엇인가? (0) | 2024.08.31 |
---|---|
[번역] Passport란 무엇인가? (0) | 2024.08.31 |