이번 강의에서는 Docker Containers와 Docker Compose를 사용하여 보안 관련 변경 사항을 테스트하는 방법을 살펴보겠습니다. 이 과정을 통해 마이크로서비스 네트워크에서 내부 서비스가 외부에 직접 노출되지 않도록 보호하고, 모든 클라이언트 애플리케이션이 반드시 엣지 서버를 통해서만 접근할 수 있도록 설정하는 방법을 배웁니다.


1. Docker 이미지 생성 및 확인

  1. Docker 이미지 생성:

    • 모든 마이크로서비스의 Docker 이미지를 s12 태그로 생성합니다.
    • Docker Desktop에서 생성된 이미지를 확인할 수 있습니다.
    • 이미지를 Docker Hub에 푸시하여 s12 태그를 가진 이미지를 확인할 수 있습니다.
  2. Docker Compose 파일 수정:

    • 이전 섹션의 코드에서 가져온 docker-compose.yml 파일에서 태그 이름을 s11에서 s12로 변경합니다.
    • 새로운 서비스인 Keycloak을 추가합니다.

2. Keycloak 서비스 추가

  1. Keycloak 서비스 정의:
    • Keycloak 서비스 이름과 이미지 이름을 지정합니다.
    • 컨테이너 이름과 포트 매핑을 설정합니다. Docker 네트워크 내부에서는 8080 포트를 사용하고, 외부에는 7080 포트를 노출합니다.
    • 환경 변수로 Keycloak 관리자의 사용자 이름과 비밀번호를 설정합니다.
    • Keycloak 서버를 개발 모드로 시작하도록 start -dev 명령어를 추가합니다.
    • extends를 사용하여 Keycloak 서비스가 easybank 네트워크 내에서 시작되도록 설정합니다.

3. 마이크로서비스 보안 설정

  1. 서비스 포트 제거:

    • accounts, loans, cards 마이크로서비스에 대해 포트 매핑을 제거하여 외부에서 직접 접근할 수 없도록 합니다.
    • 이로 인해 해당 마이크로서비스는 오직 Docker 네트워크 내부에서만 접근할 수 있습니다.
  2. Gateway 서버 환경 변수 추가:

    • application.yml 파일에서 spring.security.oauth2.resourceserver.jwt.jwk-set-uri 환경 변수를 추가하여 Keycloak 서버에서 공개 인증서를 가져올 수 있도록 설정합니다.
    • 이 변수에 localhost 대신 Docker 네트워크 내부에서 사용되는 Keycloak 서비스 이름과 포트(8080)을 설정합니다.

4. Docker Compose로 컨테이너 시작

  1. Docker Compose 실행:

    • 터미널에서 docker-compose up -d 명령어를 실행하여 모든 컨테이너를 시작합니다.
    • 이 명령어는 모든 마이크로서비스와 Keycloak 서비스를 포함하여 컨테이너를 시작합니다.
    • 이 과정은 약 2~3분 정도 소요됩니다.
  2. 중요 사항:

    • docker-compose up 명령어를 실행하기 전에 모든 로컬 애플리케이션과 기존의 Keycloak 컨테이너를 중지해야 합니다. 그렇지 않으면 새로운 Keycloak 서비스가 시작되지 않을 수 있습니다.

5. Docker Desktop에서 컨테이너 상태 확인

  1. Docker Desktop 확인:

    • Docker Desktop에서 모든 컨테이너가 정상적으로 실행 중인지 확인합니다.
    • 특히, Keycloak 컨테이너가 7080 포트에서 실행 중인지 확인합니다.
    • cards, accounts, loans 서비스는 포트 매핑이 없으며, 외부에서 직접 접근할 수 없습니다.
  2. Postman에서 API 테스트:

    • 각 마이크로서비스에 대한 직접 API 호출을 시도하여, connection refused 오류가 발생하는지 확인합니다.
    • 이는 각 마이크로서비스가 외부에 노출되지 않고, 오직 Docker 네트워크 내부에서만 접근할 수 있음을 의미합니다.

6. Gateway 서버를 통한 API 호출

  1. API 호출 테스트:

    • Gateway 서버를 통해 Get API 호출을 테스트하여, 성공적인 응답을 확인합니다.
    • PermitAll 설정이 제대로 작동하는지 확인합니다.
  2. 보안된 API 호출 테스트:

    • 인증 정보 없이 보안된 API(예: accountscreate API)를 호출하여 401 Unauthorized 오류가 발생하는지 확인합니다.

7. Keycloak 설정 및 보안 테스트

  1. Keycloak 클라이언트 및 역할 재설정:

    • 새 Keycloak 컨테이너가 생성되면서 기존 클라이언트 및 사용자 정보가 삭제되었으므로, 클라이언트 및 역할을 재설정합니다.
    • client_credentialsauthorization_code 방식 모두에 대해 클라이언트를 생성하고, 적절한 역할을 할당합니다.
  2. Client Credentials Grant Type Flow 테스트:

    • Postman을 사용하여 새로운 클라이언트 비밀 키로 access token을 생성하고, 보안된 API 호출이 성공하는지 확인합니다.
  3. Authorization Code Grant Type Flow 테스트:

    • 사용자 자격 증명을 통해 access token을 생성하고, 이를 사용하여 보안된 API 호출이 성공하는지 확인합니다.

8. 최종 검증 및 마무리

  1. 보안 설정 검증:

    • 모든 보안 설정이 Docker 컨테이너에서도 제대로 작동하는지 확인합니다.
    • 이제 loans, cards, accounts 마이크로서비스는 외부에 노출되지 않으며, 오직 Gateway 서버를 통해서만 접근할 수 있습니다.
  2. GitHub 저장소 업데이트:

    • 이번 섹션에서 작업한 모든 변경 사항을 GitHub 저장소에 업로드합니다.
    • section12 폴더에서 해당 변경 사항을 확인할 수 있습니다.

마무리

이번 섹션에서는 마이크로서비스 보안 설정을 완료하고, Docker 환경에서 제대로 작동하는지 확인했습니다. 이로써 마이크로서비스를 안전하게 보호하는 방법을 배우게 되었으며, 이는 매우 중요한 마일스톤입니다.

감사합니다. 다음 섹션에서 다시 뵙겠습니다.

profile
무슨 생각하며 사니

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN