AWS 관련 서류 준비 중이어서 아직 클라우드 서비스를 이용하지 못하는 상황이었다. 백엔드는 Spring Security 와 JWT을 이용하여 소셜 로그인 연동까지 구현하였고, 프론트도 로그인 페이지까지 만들었다. 그래서 로그인이 잘되어 쿠키에 토큰이 잘 전달되고 저장되는지 확인해보고 싶어서 개발서버를 배포하게 되었다.
연동하기에 앞서 걱정되는 부분이 몇 개 있었다.
CORS 에러
프론트 서버와 백엔드 서버가 분리되어 있는 상태였다.
예상했던 대로 CORS 에러를 만나게 되었다. 예상했던 거라 대응할 수 있었다. https://localhost:3000을 열어 주었고 Spring 시큐리티 설정도 수정하면서 프런트 로컬개발환경에서 백엔드서버와 통신할 수 있도록 열어주었다.
HTTPS 그리고 HTTP
아마 작업하면서 가장 큰 난관이었던 부분이였다. 프런트는 https://localhost:3000 백엔드는 https://localhost:9090 을 사용 중이었고 중간에는 웹서버(Nginx)는 없었다. 백엔드는 https을 적용하기 위해 자체서명 인증서를 이용하였다. 프런트 또한 프락시 설정을 통해 자체서명 인증을 받았다고 했다.
그럼 쿠키가 잘 받아져야 한다고 생각하였다. 하지만 HTTP Response 헤더 안에 Set-Cookie에는 쿠키가 잘 박히지만 웹 브라우저 쿠키 저장소에서는 쿠키가 저장되지 않는 이슈가 생겨버렸다.. 그리고 만난 오류는 SSL_ERROR.. 어쩌고저쩌고.. 쉽게 요약하면 너네 HTTPS 적용했긴 했는데~ 어느 인증기관에서 인증받았는지 모르는데 우리가 어떻게 신뢰하고 쿠키를 넘겨줘? 이런 느낌이었다. 그래서 고뇌했다.. 이거 nginx 띄워서 SSL 설정해야겠네? 그리고 HTTPS 인증해야 하니깐 도메인도 하나 필요하겠네? 그렇다 정말 돌아가는 거였다. 그렇게 최대한 무료 도메인도 찾아보고 구글링 하면서 래퍼런스를 찾아봤지만 결국 도메인을 사야 했었다.. 그렇게 결론이 나려는 순간 어느 글에서 사파리에서는 쿠키가 박히고 크롬에서만 안된다 라는 글을 보았다. 특정 브라우저에서만 안되는 거 일 수도 있겠네?라고 생각했다. 그렇게 찾은 결과.. 해결방법을 찾았다. 이제 도커를 통해 간이 개발 서버를 배포해 보자
PS) 규정상 HTTPS와 HTTP 통신은 막고 있다.
예상 시나리오 및 흐름도

- 백엔드 로컬에서 Dockerfile을 통하여 SpringBoot + gradle로 build 한 JAR 파일을 이미지화시켜준다.
- 해당 이미지를 도커 허브에 private 계정 (회사 계정) 업로드해준다.
- 프런트팀은 자기 로컬 PC에 백엔드가 올린 이미지를 PULL 받아 백엔드 미리 넘겨준 docker-compose.yml 파일을 이용하여 pull 받은 이미지와 mysql, redis을 받아와 테스트해본다.
실제 구축하면서 겪었던 문제들과 배운 점
- 도커 허브 같은 레포지토리에 같은 이미지명과 같은 태그로 올리면 덮어쓰기가 된다. 그러므로 도커허브에 올라간 이미지를 수동으로 삭제할 필요 없다.
- Tag 없이는 docker push을 할 수 없다. 그러므로 태그를 필수적으로 지정해주어야 한다.
- 도커를 빌드하기 전에./gradlew clean build을 통하여 자동으로 빌드하고 이미지화시켜주고 싶었지만 방법으로 찾아보니 이것저것 만져야 될게 많아서 일단은 수동으로 빌드하고 이미지화시키고 있다. 나중에 기회가 된다면 자동화를 시켜보고 싶다.
문서화시켜 팀원들과 공유
백엔드
- jar 파일을 도커 이미지화 시켜 Docker Hub로 Push 합니다.
1. Docker Build 하기 전에 Gralde build 먼저 수행해줍니다.
$ ./gradlew clean build
2. Dockerfile을 통해 이미지화 시켜줍니다.
# 태그가 없으면 push 할 수 없으니 태그를 필수적으로 만들어줍니다.
# mydockerhub 에는 자신의 도커 허브 레포지토리를 넣어줍니다.
docker build -t mydockerhub/api:dev .
3. 만들어진 이미지를 Docker Hub으로 Push 합니다.
$ docker push mydockerhub/api:dev
프론트
- 이미지화된 jar 파일을 Docker Hub에서 Pull 하여 사용합니다.
- 새로운 배포버전을 받기 전에는 컨테이너를 전부 지워주시고 다시 Pull 받아주시면 됩니다.
1. 이미지를 Pull 받습니다.
$ docker pull linkrstartup/api:dev
2. 원하는 폴더에 해당 docker-compose.yml 파일을 저장해줍니다. (한번만 저장해주시면 됩니다)
# ex) ~/Desktop/docker-compose.yml
version: "3"
services:
db:
container_name: mysql
image: mysql
environment:
MYSQL_DATABASE: mytest
MYSQL_ROOT_PASSWORD: 1234
TZ: Asia/Seoul
volumes:
- ./db/data:/var/lib/mysql:rw
ports:
- "3301:3306"
networks:
- backend-network
restart: always
redis:
container_name: redis
image: redis
ports:
- "6379:6379"
networks:
- backend-network
environment:
TZ: Asia/Seoul
api:
image: mydockerhub/api:dev
restart: always
ports:
- "9090:9090"
depends_on:
- db
- redis
container_name: api
environment:
TZ: Asia/Seoul
SPRING_PROFILES_ACTIVE: dev
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mytest
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: 1234
SPRING_REDIS_HOST: redis
networks:
- backend-network
networks:
backend-network:
3. 저장 하셨으면 저장된 폴더 경로 내에서 해당 명령어로 실행 시켜줍니다.
$ docker compose up -d
또는
$ docker-compose up -d
참고자료
03. Docker Hub에 image push 하기
Docker Hub에 image push 하기 [ 과정 설명 ] docker hub 에서 원본 이미지를 받아온 뒤 사용하고자 하는 container image로 변경한 뒤 다시 docker hub로 push 하기 [ Docker image 받아오기 ] docker pull [ docker hub id ] / [ i
ikcoo.tistory.com
크롬 브라우저 인증서 미적용 https 연결이 비공개로 설정되어 있습니다. 해결방법
크롬 브라우저 인증서 미적용 https 연결이 비공개로 설정 되어 있습니다. 해결방법
홈페이지를 구축하는 과정에서 인증서를 미적용 상태가 되면 아래와 같이 "연결이 비공개로 설정되어 있지 않습니다" 라는 메시지가 출력됩니다. 최근에는 웹 보안 관련 문제를 해결하기 위해
bomplays.com
'Infra' 카테고리의 다른 글
| Docker + 스프링부트 SSL 인증서 적용해보기 (0) | 2023.04.04 |
|---|---|
| EC2에 OpenVidu 서버 배포 (0) | 2023.04.04 |
| DockerFile 명령어 정리 (0) | 2023.04.04 |