TOTP 기반 2FA
2FA는 로그인 화면에 6자리 입력란을 하나 더 추가하는 작업처럼 보인다. 실제로 적용해 보니 TOTP 계산보다 더 오래 고민한 부분은 1차 인증과 최종 세션 사이의 상태를 어떻게 표현할 것인가였다. 기존 외부 Identity Provider 로그인과 OAuth·PKCE 흐름은 1차 인증이 끝나면 바로 Access Token과 Refresh Toke...
2FA는 로그인 화면에 6자리 입력란을 하나 더 추가하는 작업처럼 보인다. 실제로 적용해 보니 TOTP 계산보다 더 오래 고민한 부분은 1차 인증과 최종 세션 사이의 상태를 어떻게 표현할 것인가였다. 기존 외부 Identity Provider 로그인과 OAuth·PKCE 흐름은 1차 인증이 끝나면 바로 Access Token과 Refresh Toke...
이전 글인 Spring AI Tool Calling 설계: Tool과 DDD 계층의 책임 분리에서는 Tool을 LLM 요청을 Application UseCase로 변환하는 Adapter로 정리했다. 이 결론은 개별 Tool Wrapper와 Application UseCase의 경계를 설명하는 데 여전히 유효하다. 이번에는 질문의 범위를 Tool 하나에...
I. Shieldstral, ko-pii-public-v1 LLM 가드레일 프레임워크를 개발하면서 Shieldstral, ko-pii-public-v1 모델을 활용 중이었다. Shieldstral은 가드레일 모델로써 유해성 판정이나 업무 범위 판정 등에 활용했으며, ko-pii-public-v1는 마스킹에 활용했다. 1. Shieldstral 1....
분산 환경에서 식별자를 생성할 때 UUID는 편리한 선택지다. 별도의 중앙 발급기 없이도 각 애플리케이션에서 충돌 가능성이 매우 낮은 식별자를 만들 수 있기 때문이다. 가장 익숙한 UUIDv4는 대부분의 비트를 무작위 값으로 채운다. 고유성 측면에서는 유리하지만, 연속해서 생성한 값도 서로 멀리 떨어져 있어 생성 시점을 기준으로 정렬할 수 없다. 데...
검색형 Assistant의 모델을 교체할 때, 보통은 최종 답변만 비교하기 쉽다. 하지만 같은 정답을 내더라도 한 모델은 검색 결과 하나만 보고 답하고, 다른 모델은 추가 문맥과 예외 조건까지 확인한 뒤 답할 수 있다. 이번에는 gemini-3.5-flash와 gemini-3.1-flash-lite를 대상으로 다음 가정을 확인했다. gemin...
LLM API는 기본적으로 이전 요청을 기억하지 않는다. 같은 채팅 화면에서 연속으로 질문하더라도, 다음 요청에 과거 메시지를 포함하지 않으면 모델은 앞선 대화를 알 수 없다. 멀티턴 대화를 구현하려면 대화 내용을 저장하고, 다음 요청의 Prompt에 다시 포함하는 과정이 필요하다. Spring AI에서는 ChatMemory, ChatMemoryRe...
Spring AI를 활용하면 @Tool 메서드를 ChatClient에 등록해 LLM이 애플리케이션의 기능을 호출하게 만들 수 있다. 하지만 @Tool은 어느 계층의 책임인지 바로 드러나지 않아, 기존 Application Service나 AI 설정 클래스에 함께 두기 쉽다. 문제는 Tool이 늘어나면서 발생한다. LLM에 어떤 기능을 노출할지 결정해...
프로젝트 팀원에게 했던 PR 리뷰 중, 기록해두면 좋을 내용을 정리한 글이다. 실제 코드 리뷰를 통해 발견한 문제점과 제시했던 해결 방안을 정리했다. I. BoundedContext 독립성 문제 // content/content-api/build.gradle dependencies { implementation(project(":core...
개요 주요 아키텍처 패턴 멀티 모듈 Gradle 프로젝트 헥사고날 아키텍처 (Ports & Adapters) DDD (Domain-Driven Design) 원칙 적용 마이크로서비스 아키텍처 기반 모듈 설계 계층 분리: Presentation (API) → Application → Domain ← Infrastructure...
I. 문제 상황: Presentation 모듈의 정체성 혼란 1. 기존 구조 프로젝트 초기 구조는 다음과 같았다. connectors-backend/ ├── core/ ├── setting/ │ ├── cache/ │ ├── database/ │ ├── storage/ │ └── external/ ├── presentation/ ...