-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
3ec2da4
commit 36749a5
Showing
1 changed file
with
58 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
# 인터셉터 | ||
|
||
## 인터셉터란? | ||
|
||
NestJS의 인터셉터는 메서드 실행 전/후에 추가적으로 로직을 붙여서, 함수에서 반환된 결과를 변환하거나 기능을 확장하는데 사용한다. | ||
|
||
## 예시 코드 | ||
|
||
이번 프로젝트에서 사용한 예시 코드는 아래와 같다. | ||
|
||
먼저 Interceptor를 사용하는 부분의 코드는 아래와 같이 작성할 수 있다. | ||
로그인 handler에서는 인증 처리를 마치고, Token 정보를 반환한다. | ||
|
||
```ts | ||
@UseInterceptors(SetTokenCookieInterceptor) | ||
async login(@RequestUser() user: User): Promise<Token> { | ||
const token = await this.authService.jwtSign(user); | ||
return token; | ||
} | ||
``` | ||
|
||
`UseInterceptors` 어노테이션을 통해 해당 메서드에서 Interceptor를 사용한다고 선언한다. | ||
인증 결과인 Token을 반환한다는 점을 기억하자. | ||
|
||
이제 Interceptor의 코드는 아래와 같이 작성할 수 있다. | ||
|
||
```ts | ||
@Injectable() | ||
export class SetTokenCookieInterceptor implements NestInterceptor { | ||
constructor(private readonly configService: ConfigService) {} | ||
|
||
intercept(context: ExecutionContext, next: CallHandler): Observable<any> { | ||
const res = context.switchToHttp().getResponse<Response>(); | ||
return next.handle().pipe( | ||
map((token: Token): LoginResponseDto => { | ||
res.cookie("token", token.value, { | ||
httpOnly: true, | ||
maxAge: +this.configService.get("TOKEN_EXPIRATION_TIME"), | ||
}); | ||
return LoginResponseDto.fromJwtSignResult(token); | ||
}) | ||
); | ||
} | ||
} | ||
``` | ||
|
||
`intercept` 메서드 안에서 `next.handle()`을 호출하면 interceptor를 붙인 원본 메서드를 호출하게 된다. | ||
해당 메서드를 호출한 결과는 연달아 호출한 `pipe` 메서드 내에서 `map` 메서드에서 받아서 사용할 수 있다. | ||
(pipe 메서드의 경우 Rxjs에서 사용하는 메서드이다.) | ||
|
||
위 인터셉터에서는 전달받은 Token 객체에서 토큰 값을 추출해서, 이를 쿠키에 넣어주고 있다. | ||
intercept 메서드에서 매개변수로 받는 context를 이용해서 response를 가져올 수 있고, 이를 이용해서 쿠키에 값을 넣을 수 있다. | ||
|
||
최종적으로 map 메서드에서는 받은 token 객체를 Response DTO 형태로 변환해서 반환하므로써, 응답 형식을 결정하고 있다. | ||
|
||
## 마치며 | ||
|
||
인터셉터에는 기본적으로 RxJS의 인터페이스가 사용되고 있기 떄문에, 더 잘 활용하기 위해서는 RxJS에 대한 학습이 필요할 것 같다. |