전체 글

IT, etc
모바일 앱 백엔드를 개발하면서 눈이 많이 뜨였다. 설계자의 시점에서 프로젝트를 바라볼 필요가 있기에 많은 노력과 고생이 들어갔다. 아직 대학교 4학년이지만 어느정도 프로젝트를 거시적으로 바라보며 이 작업이 왜 필요하고 어떻게 설계하면 좋을지에 대한 감각이 생긴것 같아서 행복한 요즘이다. 이번 시간엔 카카오 OAuth 2.0 + Spring Security + JWT + Redis를 조합하여 인증 시스템을 설계한 과정을 포스팅해볼 것이다. 각각의 기술을 선택한 이유와 세부적으로 필터체인을 설계한 과정을 공유할 생각이다. 왜 JWT일까? 전통적인 웹 애플리케이션에선 세션 방식이 일반적이다. 로그인할 땐 브라우저가 자동으로 쿠키 전송 → 서버가 세션 저장소에서 조회 → 사용자 정보 확인 이후의 ..
인공지능의 등장으로 인간이 노동에서 해방될 것이라는 낙관론이 팽배하다. 인간은 더 이상 생산의 도구가 아니며, 온전히 삶을 향유하고 누리는 생물이 될 것이라는 장밋빛 전망을 떠오르는 사람들도 많다. 그러나 인간의 노동이 사라진 시점에서, 시스템이 굳이 인간을 재생산하고 그들의 권리를 보장해 줄 이유는 무엇인가. 인간이 더 이상 쓸모가 없어질 때, 사회는 왜 인간을 유지해야 하는가? 상호 의존이라는 강제력이 만든 사회 인간 사회를 지탱해 온 근간은 선의가 아니라 상호 의존성이다. 우리는 서로가 서로에게 경제적으로, 물리적으로 기여해야만 생존할 수 있었기에 명목상으로라도 타협하고 공존해 왔다. 노동력은 인간이 사회적 계약 내에서 자기 권리를 주장할 수 있게 해준 가장 강력한 강제력이었다. 하지만 AI가 ..
백엔드 개발자로서 Spring 프레임워크를 사용하다 보면 가장 많이 마주하는 어노테이션 중 하나가 바로 @Transactional이다. 하지만 어노테이션만 붙였다고 해서 모든 것이 해결되진 않는다. 분명히 붙였는데 롤백이 안되거나 트랜잭션이 아예 시작조차 되지 않는 상황인 self-invocation 문제를 CS적인 관점에서 파헤쳐보자. 그리고 마지막으로 전체적인 스프링 트랜잭션의 로드맵을 정리해볼 것이다. 왜 롤백이 안될까?다음과 같은 티켓 예매 로직이 있다고 가정해보자. @Servicepublic class TicketService { // 외부에서 호출되는 진입점 (트랜잭션 없음) public void processReservation() { log.info("예매 프로세스..
API를 개발하다 보면 다양한 예외 상황을 맞닥뜨린다. 이런 예외들을 각각의 컨트롤러마다 개별적으로 처리하게 되면 어떤 문제가 생길까? 가장 큰 문제는 코드 중복이다. 똑같은 try-catch 블록을 모든 엔드포인트에 반복해서 작성해야 하고, 나중에 에러 메시지를 바꾸려면 수십 개의 파일을 일일히 수정해야 한다. 거기다 개발자들마다 예외를 처리하는 방식도 달라서 응답 형식도 제각각이 될 수 있다. 비즈니스 로직과 예외 처리 코드가 뒤섞인다는 문제도 있다. 컨트롤러나 서비스 코드를 익을 때 정작 중요한 비즈니스 로직은 안보이고 try-catch 블록만 가득한 경험도 많이 했다. 이제 기본적인 예외 아키텍처에 대해서 알아보자. 예외 처리 아키텍처 우리 프로젝트는 예외를 3단계 계층 구조로 설계했다...
· Infra/CICD
지난 포스팅에선 OIDC를 활용해서 AWS Access Key 없이 안전하게 GitHub Actions와 AWS를 연결하는 보안의 기초를 다졌고 .env 정보들을 Parameter Store로 모두 격리하여 보안을 한 단계 더 강화했다. 또한 ALB(Application Load Balancer)를 도입하여 서버를 인터넷에 직접 노출하지 않는 단일 진입점을 구축했다. 이를 통해 EC2의 퍼블릭 IP가 바뀌어도 안정적인 접속 주소를 유지함은 물론, 보안 그룹 설정을 통해 외부의 불필요한 접근을 차단하는 견고한 인프라 방어선을 완성했다 보안 통로와 안정적인 입구를 확보했다면 이제 그 통로를 통해 들어온 배포 명령을 실제로 수행할 배포 엔진을 조립해볼 차례이다. 오늘 다뤄볼 주제는 바로 AWS CodeDep..
· Infra/AWS
이번에 새로운 프로젝트를 하면서 보안과 이벤트 유실 문제를 제거하기 위해 ALB를 도입하였다. 이번에 하면서 이전에 러닝 앱 프로젝트를 할 당시에 삽질했던 EC2 Public IP 주소 변경 문제를 완전히 해결했기에 인사이트를 공유하려고 한다. 빠르게 ALB를 만들어보면서 시작하자. ALB 생성하기 로드밸런서에 들어와서 로드밸런서 유형을 Application Load Balancer를 선택한다. 로드밸런서 이름은 개별적으로 생성한다. 인터넷에서 직접 접속 가능하게 인터넷 경계를 선택한다. 네트워크 매핑 부분에선 ec2가 있는 vpc를 선택하고 az를 두 개 이상 체크한다. 각 AZ마다 퍼블릭 서브넷을 선택한다. 보통 2a + 2c 조합을 많이 사용하는데 성능상 별 차이 없어서 이번에는 2b를 한..
· Infra/AWS
.env는 치우고, AWS SSM으로배포 때마다 서버에 접속해서 .env.prod 파일을 수동으로 수정하는 방식은 번거로울 뿐만 아니라 보안상으로도 위험하다. 이에 민감 정보(DB 접속 정보, API 키 등)를 서버에 직접 남기지 않고 AWS SSM Parameter Store에서 중앙 관리하는 방식으로 전환한다. 앞으로 프로젝트의 모든 환경 변수는 AWS 콘솔에서 관리하며 배포 시 스크립트가 이걸 자동으로 호출한다. 서버 내 시크릿 정보를 0으로 만들어보자! Parameter Store 세팅하기 먼저 AWS 콘솔에서 접속해서 Systems Manger을 입력하고 들어가서 Parameter Store를 클릭하자. 이제 파라미터 생성 버튼을 누르고 파라미터를 만든다. 파라미터 입력 규칙 이름반드..
· Infra/CICD
OIDC가 뭘까? OIDC(OpenID Connect)란 OAuth 2.0 기반의 인증 프로토콜이다. 기본적인 Access Key 같은 고정된 비밀키를 저장하지 않고 Github가 발행한 일쇠성 토큰으로 AWS에 안전하게 접속할 수 있는 인증 방식이다. 이 Github 저장소에서 온 요청은 믿어도 된다고 AWS와 Github가 미리 신뢰 관계를 맺어두는 시스템이다. 배포할 때만 잠깐 유효한 권한을 빌려 쓰기 때문에 키 유출 걱정도 없고 관리가 매우 편리한 좋은 방식이다. GitHub Actions → OIDC 토큰 발급 ↓AWS STS (Security Token Service) → 임시 자격 증명 발급 ↓AWS 리소스 접근 (E..
hskhsmm
성민의 Develog