퍼미션(permission), 롤(role), ACL(Access Control List)와 같은 개념을 사용하여 유저가 가지고 있는 속성으로 사용을 허용할지 판별
보통 가드로 구현
💡 인가를 미들웨어가 아닌 가드로 구현하는 이유는 무엇일까 ? 미들웨어는 실행 콘텍스트에 접근하지 못하고,작업완료 후 next() 호출함으로 다음 어떤 핸들러가 실행되는지 알 수가 없습니다. 하지만 가드는 실행 컨텍스트 인스턴스에 접근할 수 있어 다음 실행될 작업을 알고 있기 때문입니다.
JwtGuard와 Strategy
Express 메서드로서의 미들웨어는 NestJS에도 존재하는데 즉, Express 미들웨어의 의미에서 일반적인 미들웨어가 아닙니다.
AuthGuard() #canActivate()는 적절한 PassportStrategy를 호출하게 됩니다.
(Passport의 코드를 읽는 것은 훨씬 더 혼란스럽기 때문에 원할 때 실행할 수 있습니다.)
canActivate() 메서드에 몇 가지 논리를 추가하려면 super.canActivate(context)를 호출하여 원래의 canActivate() 메서드를 호출할 수 있습니다. 결국 Passport.authenticate()를 호출하여 <Strategy>#validate를 호출할 수 있습니다.
@Injectable()
export class CustomAuthGuard extends AuthGuard('jwt') {
async canActivate(context: ExecutionContext): Promise<boolean> {
// custom logic can go here
const parentCanActivate = (await super.canActivate(context)) as boolean; // this is necessary due to possibly returning `boolean | Promise<boolean> | Observable<boolean>
// custom logic goes here too
return parentCanActivate && customCondition;
}
}
인프라 관련 일을 할 때마다 어렵지만 재밌고 공부하는 재미가 쏠쏠한데 나중에 DevOps도 해보고 싶네요
DNS 설정은 아임웹을 사용했고, 깃허브 웹훅을 Jenkins와 연동해서 자동 빌드 테스트까지 해보겠습니다!
1. 프로젝트 생성 후 웹훅 설정
2. AWS 인스턴스 생성
3. 아임웹 추가
1) 환경설정 > 도메인
2) 보안그룹 > 인바운드 규칙
보안그룹 생성
netstat -tulpn
→ 위의 포트가 사용 안 하고 있는 포트인지 확인 필요
4. 대상 그룹 생성
로드 밸런싱 > 대상 그룹 > 대상 그룹 생성
5. 로드밸런서 DNS 연동
6. Jenkins 설정
1) Jenkins 관리 > 시스템 설정 > SSH Server 추가
Hostname : 인스턴스 프라이빗 IPv4 주소
2) Jenkins 새로운 Item
유의할 점 : 깃허브 주소, 폴더 명
GitHub hook으로 develop 자동 빌드로 세팅
Execute shell : 빌드 시 실행할 쉘 스크립트 설정
# jenkins workspace로 이동
cd /var/jenkins_home/workspace
# 빌드 후 생성된 코드파일을 tar 파일로 생성
tar -cvf dev-test-server.tar dev-test-server
# tar 파일 위치 이동
mv dev-test-server.tar dev-test-server/dev-test-server.tar
방금 저장한 젠킨스 SSH Server 등록!
# 개발서버로 이동
cd /home/ec2-user/dev-test-server
# tar 파일 풀기
tar -xvf dev-test-server.tar
# start shell 스크립트 실행
./start.sh
빌드 종료 후 실행할 shell 명령 설정
# tar 파일 삭제
rm /var/jenkins_home/workspace/dev-test-server/dev-test-server.tar
여기서부터는 젠킨스 서버 - 개발 서버 세팅!
1. 젠킨스 서버 접속
cd /jenkins/workspace/
sudo mkdir dev-test-server
# 여기서 폴더명은 아까 젠킨스에서 만들어줬던 폴더명과 동일하게 !!!!
2. 개발 서버 접속
# 소스코드 풀 폴더 생성
sudo mkdir dev-test-server && cd dev-test-server
sudo vi ecosystem.config.js
ecosystem.config.js 파일 생성
'use strict';
module.exports = {
apps: [
{
name: "dev-test-server-API", // pm2로 실행한 프로세스 목록에서 이 애플리케이션의 이름으로 지정될 문자열
namespace: "develop",
script: "dev-test-server/dist/main.js", // pm2로 실행될 파일 경로
watch: false, // 파일이 변경되면 자동으로 재실행 (true || false)
ignore_watch : ["logs"],
env: {
"NODE_ENV": "development" // 개발환경시 적용될 설정 지정
},
env_production: {
"NODE_ENV": "production" // 배포환경시 적용될 설정 지정
}
}
]
};
start.sh 쉘 스크립트 파일 생성
sudo vi start.sh
#!/bin/bash
cd /home/ec2-user/dev-test-server/dev-test-server
yarn install
npm run build
cd /home/ec2-user/dev-test-server
pm2 restart ecosystem.config.js