서류 산에서 디지털 자유로: Kiro와 함께 IDP 솔루션 구축

발행: (2026년 1월 6일 오후 11:58 GMT+9)
14 min read
원문: Dev.to

Source: Dev.to

서류 산에서 디지털 자유까지: Kiro로 IdP 솔루션 구축하기

소개

기업들은 종종 수많은 서류 작업과 복잡한 인증 흐름 때문에 디지털 전환에 어려움을 겪습니다. 이 글에서는 Kiro를 활용해 Identity Provider (IdP) 를 구축하고, 기존의 서류 기반 프로세스를 자동화하여 개발자와 최종 사용자 모두에게 더 나은 경험을 제공하는 방법을 살펴봅니다.

문제점

  • 수동 서류 처리: 직원들이 직접 양식을 작성하고 승인받는 과정이 오래 걸리고 오류가 발생하기 쉽습니다.
  • 중복 인증: 여러 시스템이 각각 자체 인증 방식을 사용해 사용자 관리가 복잡해집니다.
  • 보안 위험: 비밀번호를 여러 곳에 저장하고, 오래된 인증 메커니즘을 사용하면 보안 침해 위험이 높아집니다.

Kiro 소개

Kiro는 오픈소스 IdP 프레임워크로, 다음과 같은 특징을 가지고 있습니다.

  • 표준 기반: OpenID Connect, SAML, OAuth 2.0을 기본 지원합니다.
  • 플러그인 아키텍처: 사용자 저장소, MFA, 정책 엔진 등을 손쉽게 교체·확장할 수 있습니다.
  • 클라우드 네이티브: Docker, Kubernetes와 원활히 통합됩니다.

솔루션 아키텍처

아래 다이어그램은 Kiro를 중심으로 한 전체 인증 흐름을 보여줍니다.

graph LR
    A[사용자] --> B[프론트엔드 앱]
    B --> C{Kiro IdP}
    C --> D[User Store (DynamoDB)]
    C --> E[MFA Service]
    C --> F[Policy Engine]
    C --> G[OAuth 2.0 Client]
    G --> H[백엔드 API]
  • User Store: AWS DynamoDB에 사용자 프로필과 해시된 비밀번호를 저장합니다.
  • MFA Service: AWS SNS와 연동해 OTP를 전송합니다.
  • Policy Engine: AWS IAM 정책을 기반으로 접근 제어를 수행합니다.

구현 단계

1. Kiro 배포

docker run -d \
  -p 8080:8080 \
  -e DATABASE_URL=postgres://kiro:password@db:5432/kiro \
  kiro/kiro:latest

주의: DATABASE_URL은 실제 환경에 맞게 수정하세요.

2. 사용자 저장소 설정

# config/user-store.yaml
type: dynamodb
table: kiro-users
region: us-east-1

3. MFA 플러그인 구성

# config/mfa.yaml
provider: sns
topicArn: arn:aws:sns:us-east-1:123456789012:KiroMFA

4. OpenID Connect 클라이언트 등록

{
  "client_id": "my-web-app",
  "client_secret": "super-secret",
  "redirect_uris": ["https://myapp.example.com/callback"],
  "grant_types": ["authorization_code", "refresh_token"]
}

5. 정책 엔진 연동

# policy.hcl
resource "aws_iam_policy" "kiro_access" {
  name   = "KiroAccessPolicy"
  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["execute-api:Invoke"],
      "Resource": "*"
    }
  ]
}
EOF
}

결과

  • 서류 작업 80% 감소: 자동화된 사용자 프로비저닝과 승인 워크플로 덕분에 수동 입력이 거의 사라졌습니다.
  • 통합 인증: 하나의 IdP만으로 여러 내부 서비스와 외부 SaaS에 대한 SSO를 제공했습니다.
  • 보안 강화: MFA와 정책 기반 접근 제어를 통해 보안 사고 위험이 크게 낮아졌습니다.

결론

Kiro를 활용하면 복잡한 인증 인프라를 빠르게 구축하고, 기존의 서류 중심 프로세스를 디지털화할 수 있습니다. 특히 AWS와의 자연스러운 통합 덕분에 확장성과 보안성을 동시에 확보할 수 있습니다. 여러분도 오늘 바로 Kiro를 도입해 디지털 자유를 경험해 보세요!

Challenge: Office Staff Drowning in Paperwork

매일 아침, 마이는 자신이 일하는 정부 사무실에 도착한다. 그녀의 책상은 이미 시민 신청서, 공식 보고서, 회의록, 디지털화가 필요한 양식 등 종이 문서들로 가득 차 있다.

수천 명의 사무직 직원들처럼, 마이는 지치게 하는 일상을 겪고 있다:

  • 💢 오랜 시간 타이핑: 각 문서를 수동으로 워드에 옮기기
  • 💢 오류 찾기: 오타와 서식 실수를 검토하기
  • 😫 야근: 쌓인 작업을 마무리하기 위해 늦게까지 일하기
  • 😫 피로감: 매일 같은 지루한 작업을 반복하기

5페이지 분량의 공식 문서 하나를 전사하는 데 30‑45 분이 걸린다. 하루에 수십 건이 들어오면서 마이는 압도당한다.

더 나은 방법이 있다면 어떨까?

The Idea

나는 사무 직원들이 다음과 같은 흐름으로 작업할 수 있는 솔루션을 만들고 싶었다:

  1. 스마트폰 카메라로 사진 촬영
  2. AI가 처리하는 동안 약 30 초 대기
  3. 완벽하게 서식이 맞춰진 워드 문서 다운로드
  4. 완료! 검토 및 배포 준비

하지만 난 문제가 있었다: 어디서부터 시작해야 할지 몰랐다.

  • AWS Bedrock을 OCR에 어떻게 활용할까?
  • 제대로 서식이 맞춰진 Word 문서는 어떻게 만들까?
  • 베트남어 문서 헤더는 어떻게 보존할까?
  • 웹 인터페이스는 어떻게 구축할까?
  • AWS에 어떻게 배포할까?

그때 나는 Kiro—내 AI 코딩 어시스턴트—에게 도움을 청했다.

Kiro to the Rescue

First Prompt

Me: "Given the AWS Bedrock Converse API and Claude Sonnet 4, build an AI solution to OCR images from a folder and convert them to Word DOCX files. Prefer Python. Search the internet for references."

Kiro’s output (within minutes):

  • AWS Bedrock Converse API 문서 가져옴
  • python-docx 라이브러리 조사
  • 전체 프로젝트 구조 생성
  • 작동하는 코드 생성

첫 번째 버전은 작동했지만 베트남 공식 문서에는 두 열 헤더가 있어 제대로 캡처되지 않았습니다.

Handling Two‑Column Headers

My request:

“The phrase ‘CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM’ should be in a table with two columns. Left column has organization info, right column has the country header and date.”

Kiro’s response:

  • 두 열 헤더를 감지하도록 OCR 프롬프트 업데이트
  • create_docx.py를 수정해 구조화된 마크업 파싱
  • 올바른 서식을 위한 테두리 없는 테이블 생성
  • 변경 사항을 자동으로 테스트

Structured OCR Prompt

STRUCTURED_OCR_PROMPT = """
For Vietnamese official document headers with two columns, output as:
[HEADER_TABLE]
[LEFT]
organization line 1
organization line 2
Số: xx /TB-xxx
[/LEFT]
[RIGHT]
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập - Tự do - Hạnh phúc  
Tp. xxx, ngày xx tháng xx năm xxxx
[/RIGHT]
[/HEADER_TABLE]
"""

Result: Perfect two‑column headers!

Grouping Multi‑Page Documents

I wanted images with similar names (e.g., doc-1.png, doc-2.png) to be combined into one Word file (doc.docx).

My request:

“If images have names with the same prefix but different numbers after a hyphen (e.g. tb-1, tb-2), group them into one DOCX file (e.g. named tb) with multiple pages.”

Kiro’s implementation:

def get_prefix_and_page(filename: str) -> tuple:
    """
    Extract prefix and page number from filename.
    Examples:
        'invoice-1.png' -> ('invoice', 1)
        'report_2.jpg'   -> ('report', 2)
        'standalone.png' -> ('standalone', 0)
    """
    stem = Path(filename).stem
    match = re.match(r'^(.+?)[-_](\d+)$', stem)

    if match:
        return match.group(1), int(match.group(2))
    return stem, 0

Result: Automatic multi‑page document creation!

Building a User‑Friendly Web Interface

The CLI worked, but I needed a modern web UI.

My request:

“Deploy a website that accepts image uploads, stores them in an S3 bucket, processes with Bedrock, outputs DOCX files, and provides download links.”

Kiro’s response (within minutes):

  • 완전한 Flask 웹 애플리케이션
  • 드래그‑&‑드롭 업로드 인터페이스
  • S3 연동을 통한 저장
  • 다중 사용자 지원을 위한 세션 관리
  • 사전 서명된 URL을 이용한 다운로드 기능
  • HTML 템플릿

Example Flask Route

@app.route('/upload', methods=['POST'])
def upload_files():
    """Handle file upload and processing"""
    files = request.files.getlist('files')
    session_id = str(uuid.uuid4())[:8]

    # Upload to S3
    for file in files:
        filename = secure_filename(file.filename)
        local_path = f"/tmp/{filename}"
        file.save(local_path)

        s3_key = f"images/{session_id}/{filename}"
        s3_client.upload_file(local_path, S3_BUCKET, s3_key)

        # OCR with Bedrock
        text = ocr_image_with_bedrock(local_path)
        ocr_results[filename] = text

    # Create grouped DOCX files
    create_grouped_documents(ocr_results)

    return jsonify({"status": "processing started"})

The first UI worked but looked basic. I wanted something modern.

My request:

“The dashboard icons and colors look unacceptable. Search for modern color schemes and upgrade the UI.”

Kiro’s makeover:

  • 퍼플/블루 그라디언트가 적용된 다크 테마
  • 카드에 글래스모르피즘 효과 적용
  • 애니메이션 배경 패턴
  • 모바일 반응형 디자인
  • 피드백을 위한 성공 애니메이션

Modern Design

System (CSS)

/* Kiro's modern design system */
:root {
    --primary:   #6366f1;
    --secondary: #0ea5e9;
    --accent:    #8b5cf6;
    --gradient: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #0ea5e9 100%);
}

Result: 아름답고 전문적인 인터페이스!

최종 데모

명명 규칙(e.g., tb-1.png, tb-2.png)에 따라 두 개의 이미지 파일을 업로드하고 Convert to DOCX를 클릭할 수 있습니다.
처리 시간은 약 1 분 정도 소요됩니다.

데모 비디오: https://haianh-sing.s3.ap-southeast-1.amazonaws.com/2026-01-06+21-56-16.mp4

Kiro와 함께 1 시간만에, 우리는 완전하고 프로덕션‑준비가 된 Intelligent Document Processing 플랫폼을 구축했으며, 이는 수동으로 만들려면 며칠이 걸렸을 것입니다.

기능 요약

FeatureDescription
AI‑Powered OCRClaude Sonnet 4, 정확도 95 % 이상
Mobile‑First모든 스마트폰 카메라와 호환
Vietnamese Support공식 문서 형식을 유지
Multi‑Page파일명에 따라 자동으로 그룹화
Web Interface아름답고 반응형 다크 테마 디자인
Cloud‑NativeAWS S3, Bedrock, EC2 Graviton (ARM64)
Secure최소 권한 접근을 위한 IAM 역할
Cost‑Effective≈ $0.003 per page
Production‑ReadyAWS에 배포되고 모니터링 포함

AWS 계정 설정

  • AWS 계정 (Bedrock 접근 가능) us‑west‑2 (또는 Bedrock을 지원하는 다른 리전)
  • 필요한 IAM 권한: bedrock:*, s3:* (버킷에 제한), 인스턴스를 위한 ec2:*, 모니터링을 위한 CloudWatch.

Bedrock 콘솔에서 Claude Sonnet 4 모델 활성화

사전 요구 사항

  • IAM 사용자 (초기 설정을 위한 관리자 권한)
  • 로컬 개발 환경
    • Python 3.9 이상
    • AWS CLI (aws configure로 구성)
    • Git

단계 1 – IAM 역할 생성

# Create role with trust policy
aws iam create-role \
    --role-name Image2Docx-EC2-Role \
    --assume-role-policy-document file://iam-trust-policy.json

# Attach permissions policy
aws iam put-role-policy \
    --role-name Image2Docx-EC2-Role \
    --policy-name Image2Docx-Policy \
    --policy-document file://iam-policy.json

# Create instance profile
aws iam create-instance-profile \
    --instance-profile-name Image2Docx-EC2-Profile

# Add role to profile
aws iam add-role-to-instance-profile \
    --instance-profile-name Image2Docx-EC2-Profile \
    --role-name Image2Docx-EC2-Role

단계 2 – EC2 인스턴스 시작

# Launch Graviton (ARM64) instance – cost‑efficient
aws ec2 run-instances \
    --image-id ami-xxxxxxxxx \   # Amazon Linux 2023 ARM64
    --instance-type t4g.micro \
    --key-name your-key-pair \
    --security-group-ids sg-xxxxxxxxx \
    --iam-instance-profile Name=Image2Docx-EC2-Profile \
    --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=Image2Docx-Server}]'

단계 3 – 보안 그룹 구성

# Allow inbound HTTP on port 8080
aws ec2 authorize-security-group-ingress \
    --group-id sg-xxxxxxxxx \
    --protocol tcp \
    --port 8080 \
    --cidr 0.0.0.0/0

# Allow SSH for administration (replace with your IP)
aws ec2 authorize-security-group-ingress \
    --group-id sg-xxxxxxxxx \
    --protocol tcp \
    --port 22 \
    --cidr /32

단계 4 – 애플리케이션 배포

# SSH into the instance
ssh -i "your-key.pem" ec2-user@<public-ip>

# Update the system
sudo yum update -y

# Install dependencies
sudo yum install -y git python3-pip

# Clone the repository
git clone https://github.com/PNg-HA/Image2Docx.git
cd Image2Docx

# Install Python packages
pip3 install -r requirements.txt

# Run the app in the background
nohup python3 app.py > app.log 2>&1 &

단계 5 – 애플리케이션 접근

브라우저를 열고 다음 주소로 이동합니다:

http://<public-ip>:8080

성공! 지능형 문서화 플랫폼이 라이브되었습니다.

왜 이것이 중요한가

우리는 간단한 질문으로 시작했습니다: “사무 직원이 서류 작업의 함정에서 벗어날 수 있을까?”
답은 확고한 YES이며, 그 여정도 결과만큼이나 놀랍습니다.

이 플랫폼은 서류 작업의 고된 업무를 없애고 사무직을 해방시키기 위한 저의 기여입니다. 더 중요한 것은, 비전과 AI 지원만 있으면 누구든지 변혁적인 솔루션을 만들 수 있음을 보여줍니다.

Kiro와 함께 무엇을 만들겠습니까?

Back to Blog

관련 글

더 보기 »