31일차부터 기술에서 보안으로 주요 주제를 바꿨다.
애플리케이션에서 인증을 대부분 해야하는데 이 때 node.js 인증 라이브러리로 passport를 사용할 수 있다고한다. 일정 단계를 수행해야한다고 한다.
npm install --save @nestjs/passport passport passport-local
npm install --save-dev @types/passport-local
설치할 모듈들이 4개나 된다.
dev옵션과 save옵션을 잘 구분해서 설치해야한다.
passport에선 전략이라는 개념을 사용해서 전략이라 적었지만 그냥 사용하기 라고 생각하면 편할 것 같다.
우선 이 글에선 vanilla Passport
작동 방식을 고려한다고합니다.
@nestjs/passport를 사용하면 PassportStrategy 클래스를 확장하여 Passport 전략을 구성하는데 자세한건 코드를 사용하면서 알아갑시다.
nest g module auth
nest g service auth
nest 명령어로 auth module 및 auth service 디렉토리를 만든 후
UsersService를 캡슐화하여 AuthService를 만드는 것이 편하기에 또 만들어줍니다.
nest g module users
nest g service users
users/users.service.ts
파일을 위와같이 수정해주자. 하드코딩된 메모리 내 사용자 목록과 사용자 이름별로 검색하는 findOne메서드를 추가한 내용입니다.
users/users.module.ts
부분에서 export부분에 UsersService를 추가시켜주는 코드입니다.
auth/auth.service.ts
사용자 검색 및 암호 확인 작업을 담당하는 파일입니다. validateUser
메서드를 생성해주는 코드입니다.
auth.module.ts
부분입니다. 그냥 UserModule
가져오는 코드를 추가했습니다.
auth
에 local.strategy.ts
를 만들고 아래 코드를 작성해봅시다.
구성옵션이 없으므로 그냥 생성자는
super()
을 이용하면 됩니다. validate
도 구현된 것을 확인할 수 있습니다.
유효성 검사는 AuthService
에서 수행되는데 그저 validate()
에서 사용자가 발견되고 자격 증명이 유효하다면 Passport가 작업을 완료하는 것이고 찾을 수 없다면 예외를 발생시켜 예외 레이어(Exception Filter)가 처리할 수 있게 만들어줍니다.
각 전략의 validate()
메서드는 사용자의 존재 및 유효 결정입니다. 예를 들어 프로젝트에서 주로 진행하는 JWT에선 디코딩된 토큰을 확인하여 DB와 확인 후 일치하는 것을 평가하는 방법도 있는 것처럼 유효성 검사 패턴은 확장 가능합니다.
어쨌든 방금 만든 코드는 AuthModule
에 구성을 해야 사용할 수 있으니 다시 바꿔줍시다.
이렇게 한번에 수정할 수 있는걸 따로 나눈 이유는 local기능을 빼거나 넣을 수 있으니 한번 더 수정한 것입니다.
이렇게 전략들을 구현했다면 app.controller.ts에서 로그인 부분을 만들어서 인증 부분을 확인해봅시다.
app.controller.ts
를 아래처럼 수정합시다.
확인은 할 수 없고 맥을 사용하지 못하니 curl이 아닌 postman으로 확인해봅시다.
정상적으로 작동하는 것을 확인할 수 있습니다 ㅎㅎ