Software Developer
Profile
교육
방송 통신 대학교 2022.07 ~ 2025.02
3학년 편입, 컴퓨터 과학 3.4 / 4.5
하이미디어 아카데미 2023.07 ~ 2023.12
SpringBoot MVC Model & MyBatis & RestAPI & React
자격증
정보처리기사 2024.12.11
SQLD 2024.09.06
Skill Set
Backend
| Spring(Boot, Security) | JPA | MySQL8 | AWS(EC2, RDS) | Docker | GithubActions | Redis | Nginx |
Frontend
| HTML5 | CSS3 | SpringThymeleaf | Bootstrap |
Languages
| Java | C++ |
Project
ci cd zero downtime auth
무중단 배포와 인증·인가를 통합해 안정성과 보안을 갖춘 CI/CD 기반 시스템
사용 기술:
Spring(Boot, Security, JPA) / CI/CD(GitHub Actions, AWS(EC2, RDS), Ubuntu, Docker, Redis, Nginx) / MySQL 8.0 / RESTful API / Postman
기술 내용
Nginx을 활용한 무중단 배포
애플리케이션 배포 시 일시적인 중단이 발생하여 사용자 요청이 실패하고, 이로 인해 사용자 경험이 저해되는 문제에 대해 고민하였습니다.
1. 그래서 이를 방지하는 하나의 방법 중, 무중단 배포 기술을 도입을 하였습니다. 그리고 무중단 배포 트래픽 제어 도구로 Nginx를 선택했습니다. 그 이유는 리버스 프록시 및 로드 밸런서를 지원하며, 낮은 오버헤드로 빠른 요청 처리가 가능하기 때문입니다.
2. 다양한 배포 전략 중에서 Blue-Green 배포 전략을 채택했습니다. 왜냐하면, 기존 버전과 신규 버전의 실행 환경을 완전히 분리하여 운영할 수 있어, 새 버전의 안정성을 검증한 후 트래픽을 안전하게 전환할 수 있고, 문제가 발생했을 때 즉시 롤백이 가능하기 때문입니다.
3. Nginx의 upstream 블록을 사용해 두 배포 환경(blue, green)에 대한 서버 그룹을 정의하고, 요청을 분산 처리했습니다.
결과적으로, Blue-Green 배포 전략과 Nginx 기반의 로드 밸런싱 구조를 통해 무중단 배포 환경을 성공적으로 구축하였고, 사용자 경험을 해치지 않으면서도 안정적인 운영이 가능해졌습니다.
Refresh Token Rotation으로 인한 토큰 재사용 및 세션 탈취 문제
사용자가 refresh token을 사용해 access token을 갱신한 뒤, 이전 refresh token이 탈취된 경우 공격자가 그 이전 토큰으로 다시 요청이 가능한 보안적 이슈가 발생하였습니다.
1. 이와 같은 토큰 탈취 및 재사용 문제를 방지하고자, 블랙리스트 보안 기능을 구현하였습니다. 서버에서는 Refresh Token의 고유 식별자 및 만료 정보를 저장하고, 이를 바탕으로 토큰의 사용 여부와 유효성을 실시간으로 검증하는 방식으로 대응하였습니다.
2. Refresh Token을 서버에 저장하면 JWT의 stateless 특성이 사라지고, 서버 분산 환경에서 동기화 및 부하 문제가 발생할 수 있습니다. 이를 해결하기 위해 Redis를 사용하여 Refresh Token을 관리함으로써, 데이터베이스 접근 없이도 빠른 검증이 가능하고, 서버 간 상태 공유 없이도 일관된 인증 처리가 가능하게 하였습니다.
토큰 재사용 공격을 효과적으로 차단함으로써 인증 시스템의 보안성을 향상시켰고, Redis를 통한 경량 상태 관리로 분산 서버 환경에서의 복잡성을 최소화할 수 있었습니다. 이에 따라 stateless 기반 JWT 구조의 이점을 유지하면서도, stateful 방식의 보안 제어 기능을 안정적으로 접목시킬 수 있었습니다.
Private RDS 접근
AWS VPC의 Public Subnet에 위치한 RDS 인스턴스를 보안 및 성능 개선을 위해 Private IP로 변경한 결과, 클라이언트가 Private Subnet에 위치한 RDS에 접근할 수 없어 데이터베이스 연결 오류가 발생하였습니다.
1. 우회 접근 방법으로 SSM(Systems Manager)와 SSH 방식 중, 키 관리와 간단한 설정으로 터널을 생성할 수 있는 SSH 방식을 선택했습니다.
2. SSH 터널을 통해 EC2 인스턴스를 중계점으로 설정한 후, VPC의 Private Subnet에 위치한 RDS에 접근하기 위해 로컬 포트 포워딩 방식을 사용하여 터널을 구축하였습니다.
SSH 터널을 통해 로컬 환경에서 Private Subnet에 위치한 RDS 인스턴스에 안전하게 접근할 수 있게 되었으며, 데이터베이스 연결 오류 문제를 효과적으로 해결할 수 있었습니다. 이를 통해 보안은 강화하면서도 개발 및 운영 환경에서의 접근성은 유지하는 안정적인 구조를 확보하였습니다.
hicoding groupware
복잡한 업무도 쉽게 처리할 수 있는, 클라우드 그룹웨어 시스템
사용 기술:
JPA(DataJPA, Criteria) / RESTFul / Deploy(AWS(EC2, S3, RDS), Docker, Ubuntu) / MySQL / React
기술 내용
계층형 쿼리의 성능 한계와 DFS 기반 트리 탐색을 통한 최적화
계층형 쿼리를 이용해 댓글과 대댓글을 처리할 경우, 심각한 성능 문제에 직면할 수 있습니다. 이러한 쿼리는 각 댓글의 부모를 따라 재귀적으로 데이터를 조회해야 하므로, 댓글의 깊이가 깊어지거나 전체 댓글 수가 많아질수록 쿼리 비용이 기하급수적으로 증가합니다. 그 결과, 조회 성능이 저하되고 데이터베이스에 과도한 부하가 발생하여, 특히 트래픽이 많은 환경에서는 시스템 전체의 응답 속도에 악영향을 줄 수 있습니다. 이는 중요한 병목 요소로 작용할 수 있습니다.
이러한 성능 문제를 해결하기 위해, 계층형 쿼리를 직접 사용하는 대신 다진 트리 기반의 DFS(Depth-First Search) 순회 방식을 도입했습니다. 이 방식은 댓글 데이터를 계층 트리 구조로 구성한 후, 메모리 상에서 깊이 우선 탐색을 수행하여 렌더링합니다. 하지만, 일반적인 DFS 탐색 방식에는 또 다른 문제가 존재합니다. 자식 노드를 순차적으로 탐색하기 때문에, 등록일 기준으로 가장 최신의 댓글이 하단에 배치되는 정렬 문제가 발생할 수 있습니다. 이를 해결하기 위해 DFS 수행 시 자식 노드들을 등록일 역순으로 스택에 삽입하도록 구성했습니다. 이렇게 하면 스택의 LIFO(Last-In-First-Out) 특성에 따라 최신 댓글이 먼저 탐색되어, 각 계층에서도 자연스럽게 등록일 기준 최신순 정렬을 유지할 수 있습니다.
이러한 구조적 개선을 통해 댓글 조회 성능을 크게 향상시킬 수 있었습니다. 데이터는 메모리에서 처리되므로 데이터베이스에 과도한 부하를 주지 않으며, 트리 구조의 탐색 역시 빠르게 수행됩니다. 특히 최신 댓글이 상단에 배치되도록 정렬 전략을 적용함으로써, 사용자 입장에서는 보다 직관적이고 가독성 높은 UI/UX를 경험할 수 있게 되었습니다.
About Me
기꺼이 오늘을 딛고 나아가며, 끝내 마주한 어려움들을 이겨냅니다. 그것이 제가 가진 힘의 원천입니다.
‘기꺼이’란, 어떤 일이 닥쳤을 때 그것을 되레 발판 삼아 멀리 도약하는 것을 말합니다.
저는 늘 그 마음으로, 어려움은 배움으로, 도전은 성장의 기회로 바꾸며 나아가고 있습니다.
지금의 저는 완성된 사람이 아니라, 더 나아지고 싶은 사람입니다.
작더라도 눈에 보이는 성장을 놓치지 않으려 노력해왔고, 그 과정에서 쌓인 경험과 태도는 지금의 저를 만든 핵심이 되었습니다.
돌아보면 쉽지 않은 순간마다 끝까지 해내고자 했고, 그런 시간을 통해 배운 끈기와 집중력은 이제 제가 속한 조직에 실질적인 가치를 더할 수 있는 자산이 되리라 믿습니다.
지금껏 그래왔듯, 앞으로도 주어진 역할 안에서 꾸준히 가치를 만들어가겠습니다. 편하실 때 언제든 연락 주세요. 열린 마음으로 기다리고 있겠습니다.
끝까지 읽어주셔서 감사합니다.