전체 글 41

[프로젝트] Spring Boot 에서 인증 시스템 설계하기 - OTP 2FA + JWT + Redis로 보안 구현 (feat. 스프링부트, Spring Security, Redis TTL 기반 임시 저장소)

상담사용 인증 시스템을 설계하며 고민한 보안 아키텍처, Redis 기반 OTP 챌린지, JWT Refresh Token Rotation 전략을 3단계 Phase로 정리했습니다. 1. [Phase 1] 로그인 → OTP 챌린지 생성설계 원칙: "비밀번호만으로는 문을 열 수 없다" 상담사가 이메일과 비밀번호를 제출하면, 서버는 토큰을 발급하지 않습니다.대신 OTP 챌린지를 생성하고 이메일로 6자리 인증 코드를 발송합니다. 이 단계에서 신경 쓴 보안 포인트는 세 가지입니다. 첫째, 이메일 열거(Email Enumeration) 방지.이메일이 존재하지 않는 경우와 비밀번호가 틀린 경우를 동일한 에러 코드(INVALID_CREDENTIALS)로 응답합니다. 공격자가 "이 이메일은 가입되어 있다"는 정보를 얻지 ..

프로젝트 01:27:34

[프로젝트] 3.49s에서 0.925ms로: Google API 배치 호출과 PostGIS로 응답 시간 74% 개선 (feat. 스프링부트)

1. 왜 API를 전환했는가 - 12초짜리 API현재 개발 중인 프로젝트는 N명의 참여자가 모두 공평하게 이동할 수 있는 최적의 만남 장소를 찾는 서비스입니다.핵심 알고리즘1. 참여자 N명의 위치 → 무게중심(centerPoint) 계산2. 무게중심 5km 반경 내 지하철역 M개 검색3. 각 역까지 모든 참여자의 대중교통 경로 탐색4. MinSum(총 이동시간 최소) 기준 Top 3 추천 평가 지표minSum: 모든 참여자 이동시간의 합계 (가장 중요)minMax: 가장 먼 참여자의 이동시간 (공평성)avgDuration: 평균 이동시간초기 구현: ODsay API 선택 이유✅ 국내 대중교통 특화 (환승 정보 정확도 높음)✅ 무료 API (비용 부담 없음)❌ Rate Limit 엄격 (동시 요청 제한)❌..

프로젝트 2026.02.17

[데이터베이스] .NET Framework 1.1에서 Oracle 11g + 19c를 동시에 연결한 방법 (ORA-28040 해결기)

1. 문제 상황레거시 환경(.NET Framework 1.1, VS2003)에서두 개의 Oracle DB(11g, 19c)를 동시에 사용해야 했다. 사용 구조 System.Data.OracleClientOCI DLL 직접 로딩32bit IIS 환경19c 접속 시 다음 에러 발생ORA-28040: No matching authentication protocol 2. 단순한 해결책이 통하지 않았던 이유이전 글 참고https://hyunolike.tistory.com/25 [CS] 왜 .NET은 Oracle Client가 필요했고 Spring은 필요 없을까? (feat. 닷넷, 스프링, 스프링부트)“같은 Oracle DB를 쓰는데,왜 .NET에서는 항상 Oracle Client 설치 때문에 고생했고Sprin..

데이터베이스 2026.02.16

[프로젝트] "AWS가 이렇게 쉬웠어?" 네이버 클라우드 경험자가 말하는 AWS EC2 배포 자동화 구축기

이전 글에서 https://hyunolike.tistory.com/37 [프로젝트] 네이버 클라우드로 인프라 구축하기 (VPC, 서브넷, 로드밸런서)Spring Boot 애플리케이션을 개발하고 나면 이제 실제 사용자가 접속할 수 있는 프로덕션 환경을 구축해야 합니다.저는 Naver Cloud Platform을 선택했고 Docker와 GitHub Actions를 활용해 자동 배포 파이프라hyunolike.tistory.com네이버 클라우드로 인프라 구축기를 작성했습니다. 상담 관리 플랫폼을 개발하면서 AWS 클라우드 환경에서 배포 자동화를 구축했습니다.이 글에서는 AWS EC2 배포 자동화 과정과 함께 실제 프로덕션 환경에서 두 클라우드 플랫폼(네이버클라우드, AWS)을 사용하며 느낀 차이점을 공유합니다...

프로젝트 2026.02.16

[프로젝트] save() 없이도 저장된다? JPA Cascade + Dirty Checking으로 참여자 생성 API를 3단계 리팩토링한 이야기 (feat. 퍼사드 패턴, 스프링부트)

https://github.com/dnd-side-project/dnd-14th-8-backend GitHub - dnd-side-project/dnd-14th-8-backend: [모여락] 모임 일정 및 장소 조율 통합 서비스[모여락] 모임 일정 및 장소 조율 통합 서비스. Contribute to dnd-side-project/dnd-14th-8-backend development by creating an account on GitHub.github.com 서비스가 커질수록 “로직이 어디에 있는지” 찾는 시간이 늘어납니다.참여자 생성 API를 리팩토링하면서 아키텍처를 더 ‘깔끔하게’ 만들려는 시도에서 출발했지만최종적으로는 JPA가 제공하는 영속성 컨텍스트의 힘(Dirty Checking + Casc..

프로젝트 2026.02.08