Guard + Strategy vs Extending Guard
기본적인 개념
Guard + Strategy : 기본적으로 어느정도 구조가 짜여진 전략(Strategy)을 사용하는 Guard
validate 함수를 사용하는데 자격증명이 표시되는 방식에 대한 세부사항만 다를 뿐 대부분 유사한 패턴을 따른다.
사용자가 발견되고 자격증명이 유효하면 사용자가 반환되어 Passport가 작업을 완료한다.
validate 함수가 true or 값이 존재하면 통과, null이면 통과x
Extending Guard : 전략(Strategy)를 사용하지 않고 Guard를 Custom하여 사용
vaildate 함수 대신에 canActivate 함수를 사용한다.
Oauth : Guard + Strategy 선택
이유는 로그인 하기만 하면 되는데 passport가 알아서 다해줘서 굳이 guard를 Extending 할 필요성을 못느낌
https://docs.nestjs.kr/security/authentication#implementing-passport-local
JWT : Extending Guard 선택
이유는 Access Token과 Refresh Token 둘다 인증하고 오류 처리해야하기 때문에 확장할 필요성을 느낌
context를 사용해야함
실제 공식 문서에도 그렇게 나와있음
https://docs.nestjs.kr/security/authentication#extending-guards
가드 위치???
전역 가드 vs 필요한 컨트롤러에만 가드
로그인 없이 이용가능하게 하려면 후자로 해야하지만 우리 서비스는 로그인 없이는 이용이 불가능한게 맞으므로 JWT를 전역 가드로 설정
전체적인 흐름
Naver login을 시도하면 NaverOauthGuard를 거쳐서 로그인을 하게된다.
NaverOauthGuard는 Naver 로그인 수행 후 DB에 유저 정보가 없으면 저장 후 정보 리턴, 있으면 해당 정보를 리턴한다.
이 때, 성공적으로 유저 정보를 가져오게되면 JWT의 accessToken과 refreshToken을 발급받게되고 DB에는 refreshToken이 저장된다.
이후 모든 컨트롤러에는 JwtGuard가 붙어있어서 모든 요청은 Jwt Token이 유효한지 아닌지 검사를 받은 후에 수행하게된다.
JwtGuard는
https://www.notion.so/JWT-eaa36bfbcc324ed8a47e41194a63b8ad
의 비교 과정에 따라 유효한지 아닌지 검사한다.
Naver Oauth 구현 중 헷갈린 내용
Extending Guard와 Guard + Strategy 으로 나뉘게되는데 Strategy에 두 번째 인자로 이름을 제공하지 않으면 기본 이름이 지정되는데 헷갈리지 않게 Strategy의 이름을 Naver로 명시
흐름은 NaverOauthGuard는 "naver"라는 Strategy를 사용하는 Guard이므로 @UseGuards(NaverOauthGuard)가 달린 컨트롤러는 해당 Guard를 거쳐간다.