서류 산에서 디지털 자유로: Kiro와 함께 IDP 솔루션 구축
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
나는 사무 직원들이 다음과 같은 흐름으로 작업할 수 있는 솔루션을 만들고 싶었다:
- 스마트폰 카메라로 사진 촬영
- AI가 처리하는 동안 약 30 초 대기
- 완벽하게 서식이 맞춰진 워드 문서 다운로드
- 완료! 검토 및 배포 준비
하지만 난 문제가 있었다: 어디서부터 시작해야 할지 몰랐다.
- 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. namedtb) 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 플랫폼을 구축했으며, 이는 수동으로 만들려면 며칠이 걸렸을 것입니다.
기능 요약
| Feature | Description |
|---|---|
| AI‑Powered OCR | Claude Sonnet 4, 정확도 95 % 이상 |
| Mobile‑First | 모든 스마트폰 카메라와 호환 |
| Vietnamese Support | 공식 문서 형식을 유지 |
| Multi‑Page | 파일명에 따라 자동으로 그룹화 |
| Web Interface | 아름답고 반응형 다크 테마 디자인 |
| Cloud‑Native | AWS S3, Bedrock, EC2 Graviton (ARM64) |
| Secure | 최소 권한 접근을 위한 IAM 역할 |
| Cost‑Effective | ≈ $0.003 per page |
| Production‑Ready | AWS에 배포되고 모니터링 포함 |
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와 함께 무엇을 만들겠습니까?