데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Keycloak 활용한 SSO 구현 : #5 SSO 연동 테스트: Keycloak과 애플리케이션의 완벽한 통합

      eclipse 25.01.10
      3,635 7 1
      DEVOTEE 요약
      이번 블로그에서는 Keycloak과 애플리케이션의 통합을 통해 SSO(단일 로그인) 및 SSO 연동 테스트를 설정하는 방법을 설명합니다. ArgoCD 설치 및 Keycloak과의 연동을 통해 안정적이고 일관된 배포 환경을 구축하며, 마지막으로 로그아웃 기능을 추가하여 Single Sign Out 기능을 테스트합니다. 이를 통해 안전하고 효과적인 접근 관리 및 인증 환경을 구축할 수 있습니다.
      DEVOTEE 추천 블로그

      SSO 연동 테스트: Keycloak과 애플리케이션의 완벽한 통합

      이번 글에서는 이전에 구성한 샘플 애플리케이션에 Single Sign Out을 구성해보고, 사전에 구축한 Keycloak을 활용하여 ArgoCD와 연동하는 방법을 안내드리겠습니다.


      [연재순서]

      1. eksctl로 손쉽게 시작하는 Kubernetes 클러스터 및 노드그룹 생성 방법

      2. 완벽한 HTTPS 보안: Ingress 컨트롤러와 Let's Encrypt으로 무료 인증서 설정하기

      3. Keycloak 설치부터 설정까지: SSO를 위한 첫걸음

      4. SSO 연동 샘플 애플리케이션 구성하기: 실전 가이드

      5. SSO 연동 테스트: Keycloak과 애플리케이션의 완벽한 통합


      ArgoCD 설치하기

      ArgoCD는 Kubernetes 환경에서 애플리케이션을 지속적으로 배포(CD, Continuous Delivery)하기 위한 GitOps 기반의 오픈 소스 도구입니다.

      Git 리포지토리를 단일 소스로 삼아 Kubernetes 클러스터의 상태를 선언적 방식으로 관리하며, 안정적이고 일관된 배포 환경을 제공합니다.

      이번 가이드에서는 ArgoCD를 설치하고 Keycloak과 연동하여 SSO(Single Sign-On) 테스트를 수행해보겠습니다.

      이를 통해 안전하고 효율적인 접근 관리 및 인증 환경을 구축할 수 있습니다.

      ArgoCD 설치

      kubectl create namespace devops-argocd
      
      kubectl apply -n devops-argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

      Ingress 설치

      ingress.yaml 파일을 하나 생성합니다.

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: argocd-ingress
        namespace: devops-argocd
        annotations:
          cert-manager.io/cluster-issuer: letsencrypt-prd
          ingress.kubernetes.io/force-ssl-redirect: "true"
          kubernetes.io/tls-acme: "true"
          nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
          nginx.ingress.kubernetes.io/ssl-passthrough: "true"
      spec:
        ingressClassName: nginx
        rules:
          - host: argocd.<<< YOUR_DOMAIN >>>
            http:
              paths:
                - path: /
                  pathType: Prefix
                  backend:
                    service:
                      name: argocd-server
                      port:
                        number: 443
        tls:
          - hosts:
              - argocd.<<< YOUR_DOMAIN >>>
            secretName: argocd-acme-crt

      Ingress를 클러스터에 배포합니다.

      kubectl apply -f ingress.yaml
      
      kubectl get ing -n devops-argocd
      NAME                        CLASS    HOSTS                  ADDRESS   PORTS     AGE
      argocd-ingress              nginx    argocd.<<< YOUR_DOMAIN >>>             80, 443   11s
      cm-acme-http-solver-x879f   <none>   argocd.<<< YOUR_DOMAIN >>>             80        8s

      브라우저로 접속되는지 확인합니다. 인증서가 Stage용으로 배포되었기 때문에 경고 메시지를 확인할 수 있습니다.

      일단 접속이 되면 인증서를 Production용으로 변경합니다.

      yq 유틸리티가 설치되어 있지 않다면, ingress.yaml 파일에서 cert-manager.io/cluster-issuer 부분을 letsencrypt-prd로 직접 변경하시면 됩니다.

      yq e '.metadata.annotations."cert-manager.io/cluster-issuer"="letsencrypt-prd"' ingress.yaml --inplace
      kubectl apply -f ingress.yaml
      
      kubectl get ing -n devops-argocd
      NAME             CLASS   HOSTS                  ADDRESS                                                                        PORTS     AGE
      argocd-ingress   nginx   argocd.<<< YOUR_DOMAIN >>>   a9af0f1f2a24d48979b3a6f9a3cdd8e8-1458433199.ap-northeast-2.elb.amazonaws.com   80, 443   3m39s


      Keycloak 설정하기

      ArgoCD의 배포와 접속이 성공적으로 완료되었다면, 이제 Keycloak에서 ArgoCD와의 원활한 인증 및 권한 관리를 위해 클라이언트를 생성하고 세부 설정을 진행해야 합니다.

      이 단계에서는 Keycloak이 ArgoCD의 인증 서버 역할을 수행할 수 있도록 클라이언트 ID, 인증 방식, 리디렉션 URI 등의 필수 설정을 꼼꼼하게 구성해야 합니다.

      이를 통해 사용자 접근 제어 및 보안 정책이 체계적으로 적용될 수 있습니다.

      image.png

      Capability config 설정

      image.png

      로그인 설정과 관련된 URL을 그림을 참고하여 입력합니다.

      image.png

      Client Secret을 복사하여 ArgoCD 설정시에 사용합니다.

      image.png

      Client Scope 설정시에 이름을 groups로 입력합니다.

      image.png

      새로운 맵펑를 생성합니다. 타입은 Group Membership을 선택합니다.

      image.png

      이름과 토큰 클레임명을 groups로 지정합니다.

      image.png

      이제 클라이언트를 구성하여 그룹 범위를 설정할 수 있습니다.

      Clients > argocd > Client scopes > Add client scope > groups 추가

      image.png

      신규로 그룹을 생성합니다.

      image.png

      멤버에 alice를 추가합니다.

      image.png

      이상으로 Keycloak에서 설정하는 부분은 모두 완료하였습니다.


      ArgoCD OIDC 설정하기

      Keycloak에서 설정한 클라이언트 정보를 ArgoCD에서 설정하는 작업을 진행합니다. 먼저 argocd Client Secret 값을 base64로 인코딩해야 합니다.

      인코딩한 값을 oidc.keycloak.clientSecret 키로 추가합니다.

      echo -n 'pRVYem4wAJFnVd4PAyTwAEr7ph3IYtjl' | base64
      cFJWWWVtNHdBSkZuVmQ0UEF5VHdBRXI3cGgzSVl0amw=
      
      kubectl edit secret argocd-secret -n devops-argocd
      apiVersion: v1
      data:
        admin.password: JDJhJDEwJG5VNC2uYjZUZ1hwc9ByempzMXRKZHV2VHBNVHpBeUY4OFdUMHNnL2o0b4QxYkF1MVZJa4VP
        admin.passwordMtime: MjAyYC0xMi0yKFQwMjowTKo0TFo=
        oidc.keycloak.clientSecret: <<< CLIENT_SECRET (base64) >>>
        server.secretkey: cTVpU2k2b0lJSHNyNlc1Qzl2SUgzV5BQZXNSOEU9b1NncFhoa3NNa0RSST0=
        ....

      이제 config 맵을 구성하고 OIDC 구성을 추가하여 Keycloak 인증을 활성화 할 수 있습니다.

      kubectl edit configmap argocd-cm -n devops-argocd
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: argocd-cm
      data:
        url: https://argocd.<<< YOUR_DOMAIN >>>
        oidc.config: |
          name: Keycloak
          issuer: https://keycloak.<<< YOUR_DOMAIN >>>/realms/quickstart
          clientID: argocd
          clientSecret: $oidc.keycloak.clientSecret
          requestedScopes: ["openid", "profile", "email", "groups"]
      • issuer Keycloak 서버 및 realm 정보를 입력합니다. Keycloak 버전이 17보다 이전인 경우 Keycloak 릴리스의 발급자 URL에는 /auth가 포함되어야 합니다. (본 가이드에서는 /realms/quickstart)

      • clientID Keycloak에서 구성한 클라이언트 ID로 설정됩니다.

      • clientSecret argocd 클라이언트의 시크릿 키입니다.

      • requestedScopes 기본 범위에 추가하지 않은 경우 그룹 클레임이 포함됩니다.

      ArgoCDAdmins 그룹으로 로그인 한 사용자는 Admin 권한을 부여합니다.

      
      kubectl edit configmap argocd-rbac-cm -n devops-argocd
      
      apiVersion: v1
      kind: ConfigMap
      data:
        policy.csv: |
          g, ArgoCDAdmins, role:admin
      ...

      Trouble shooting

      혹시, 정상적으로 설정했는데 계속 401 오류가 발생하나요? 로그인 인증은 되었으나 지속적으로 오류가 발생하면 Pod를 재시작합니다.

      kubectl rollout restart deployment argocd-server -n devops-argocd

      테스트

      ArgoCD 로그인 페이지 오른쪽 상단에 LOG IN VIA KEYCLOAK 버튼이 생성되었습니다.

      해당 버튼을 클릭하고 Keycloak 인증을 받으면 정상적으로 로그인 할 수 있습니다.

      image.png

      image.png


      Single Sign Out 설정하기

      #4 SSO 연동 샘플 애플리케이션 구성하기: 실전 가이드 에서 추가적으로 Single Sigh Out을 설정하고 테스트해보겠습니다.

      Keycloak Client 설정

      Keyclaok 관리페이지에서 이전 가이드에서 생성한 nodejs-app Client에 logout 관련된 부분을 업데이트 합니다.

      image.png

      Keycloak app.js 추가

      로그 아웃을 처리하는 부분을 아래와 같이 추가합니다.

      ....
      app.get('/logout', (req, res) => {
        const keycloakLogoutUrl = `${keycloakConfig['auth-server-url']}/realms/${keycloakConfig.realm}/protocol/openid-connect/logout`;
        req.logout();
        req.redirect(keycloakLogoutUrl = `?rediret_uri=${encodeURIComponent('http://<<< SERVER_HOST >>>:<<< SERVER_PORT >>>')}`);
      });
      ....

      Logout 테스트 하기

      image.png

      image.png

      다시 접속을 시도해보면 세션이 만료되어 로그인 창이 출력 되는 것을 확인할 수 있습니다.

      http://<<< SERVER_HOST >>>:<<< SERVER_PORT >>>/secured


      마무리

      처음 연재를 시작할 때는 이전에 사용했던 샘플 애플리케이션을 활용하려고 했지만, 개발 환경과 버전 이슈로 재사용하지 못한 점이 조금 아쉽습니다.

      현재 진행 중인 프로젝트에서도 Keycloak은 매우 유용하게 활용되고 있으며, 향후 신규로 개발하는 서비스에서도 연동할 예정입니다.


      앞으로는 Keycloak과 다양한 오픈소스 간의 연동을 위한 설정과 최적화 방안을 다루어 볼 예정입니다.

      다음 연재에서 더 유익한 내용으로 다시 만나 뵙겠습니다. 감사합니다!

      1. eksctl로 손쉽게 시작하는 Kubernetes 클러스터 및 노드그룹 생성 방법

      2. 완벽한 HTTPS 보안: Ingress 컨트롤러와 Let's Encrypt으로 무료 인증서 설정하기

      3. Keycloak 설치부터 설정까지: SSO를 위한 첫걸음

      4. SSO 연동 샘플 애플리케이션 구성하기: 실전 가이드

      5. SSO 연동 테스트: Keycloak과 애플리케이션의 완벽한 통합

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      eclipse 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기