코드잇이라는 프론트엔드 부트캠프에서 협업으로 팀 프로젝트를 진행하여 restAPI 서버를 구현하면서 겪었던 이슈들과 해결과정들을 간략하게 기록하는 글입니다.
우선 이슈 상황을 먼저 설명드리자면 ,
- AWS 암호키와 jwt 키를 보안하는데 local과 github push 시 외부에 노출되는 이슈
- 자바 collections 반복문 로직 안에서의 concurrent 에러
- 프론트 운영서버와의 CORS 관련 문제
위와 같은 세가지 상황을 기록하겠습니다.
하단의 상황은 이미 블로그 글로 정리하였기 때문에 제외하였습니다.
- Multipart 형태의 http 요청 데이터를 받을 때 다른 dto와 같이 받는 상황에서 데이터를 바인딩하지 못하는 이슈 발생
- 배포 과정에서 에러가 나서 서버가 다운되거나 배포 도중 애플리케이션이 작동하지 않는 이슈 상황
☀️ AWS 암호키와 JWT 키와 같은 보안이 필요한 데이터의 외부 노출
백엔드 팀원과 Github로 형상 관리를 하면서 CI/CD 자동화 배포를 구축하였는데 AWS Key 정보 , JWT 키 , DB 와 같은 민감한 정보가 외부에 노출 되지 않게 하면서 CI/CD 과정에서 개발자가 추가적인 행동을 하지않고 자동으로 배포할 때 정보를 적용할 수 있게 어떻게 할 지 를 생각해봤습니다.
이러한 정보를 감추는 다양한 방법들은
- 환경 변수 사용
- .gitignore를 이용해 민감 정보가 담긴 파일(.env) 따로 관리
- Jasypt를 이용한 설정 파일 속성 값 암호화
- Vault, spring cloud config와 같은 중앙화된 민감 정보 저장소 활용
와 같은 방법들이 있는데 , 저는 CI/CD 자동화 scripts들이 Github에서 관리를 하기 때문에 자동화 과정에서 적용하기보단 배포 후 애플리케이션단에서 보안 정보들을 외부(EC2 서버)에서 가져오는 방식을 이용하는 게 적합하다고 생각하여 .gitignore를 이용해 .env 파일을 따로 관리하는 방법을 선택하였고 해당 방법과정에 대해 설명 하겠습니다.
우선 프로젝트의 루트 디렉토리에 .env 파일을 생성합니다.
#운영에서는 서버에 미리 저장해둔 .env 파일을 CD 과정에서 복사하여 사용
AWS_ACCESS_KEY_ID=[본인 정보]
AWS_SECRET_ACCESS_KEY=[본인 정보]
AWS_REGION=[본인 정보]
JWT_SECRET=[본인 정보]
팀원과 Github을 사용하여 형상 관리를 진행하고 있기 때문에 .env 파일이 공유 레포지토리에 올라가지 않도록
.gitignore를 꼭 설정해줘야 합니다.
/.gitignore
...
.env*
/src/main/resources/application.yml
jwt:
secret: ${JWT_SECRET:default_jwt_secret}
# S3
cloud:
aws:
credentials:
access-key: ${AWS_ACCESS_KEY_ID:default_access_key}
secret-key: ${AWS_SECRET_ACCESS_KEY:default_secret_key}
s3:
region: ${AWS_REGION:default_region}
stack:
auto: false
프로젝트의 설정 yml 파일을 위와 같이 적용합니다.
여기서 끝나는 것이 아니라 해당 변수명들로 .env파일의 적용하기 위해서는 Dotenv라는 라이브러리를 사용하여 적용할 수 있습니다.
@SpringBootApplication
public class Team12BeApplication {
public static void main(String[] args) {
System.setProperty("AWS_ACCESS_KEY_ID", dotenv.get("AWS_ACCESS_KEY_ID"));
System.setProperty("AWS_SECRET_ACCESS_KEY", dotenv.get("AWS_SECRET_ACCESS_KEY"));
System.setProperty("AWS_REGION", dotenv.get("AWS_REGION"));
System.setProperty("JWT_SECRET" , dotenv.get("JWT_SECRET"));
new SpringApplicationBuilder(Team12BeApplication.class)
.properties(APPLICATION_LOCATIONS)
.run(args);
}
}
위와 같이 코드를 짜면 애플리케이션이 자동화 배포를 완료시 .env파일에 변수명들을 읽어올 수 있습니다!!
이 방법에 단점이 있다면 백엔드 팀원과의 .env파일 공유를 수동으로 파일을 전달해야 한다는 번거로움이 생기는데 이 부분도
자동화 할 수 있는 방법을 찾게된다면 추후에 기록해 볼 생각입니다.
'TroubleShooting' 카테고리의 다른 글
| [FeedB 프로젝트] Java Collection 반복문에서 수정 또는 삭제 concurrentmodificationexception 에러 (0) | 2024.07.04 |
|---|---|
| [FeedB 프로젝트] json 형태의 값과 이미지 파일(MultipartFile)을 한 API에서 요청 받기 (0) | 2024.06.29 |