본문 바로가기

전체 글151

Spring Security와 JWT Spring Security를 프로젝트에 적용해보자. 최대한 JWT의 장점을 잘 살릴 수 있는 방법은 무엇일까? JWTJWT가 무엇이고, 어플리케이션이 어떤 구조를 띄고 있을 때 가장 효율적일까?JWT는 무상태 인증 방식으로, 토큰의 Payload에 사용자 정보를 담아 인증을 수행하는 방식이다.클라이언트가 JWT를 요청 헤더 또는 쿠키에 포함하여 서버에 전달하고, 서버는 이를 검증하여 사용자를 인증한다. JWT에는 사용자 정보가 포함되어 있기 때문에, 컨트롤러에서 ArgumentResolver등을 활용하여 DB와 추가적인 통신 없이 사용자 객체를 추출할 수 있다. 이러한 특성 덕분에 JWT는 MSA구조에서 유리하다.각 서비스가 독립적으로 동작하며 인증 상태를 공유할 필요가 없는 구조에서는, 중앙 인증 .. 2025. 3. 18.
최종 프로젝트 KPT 회고 KEEP🥇 기록프로젝트 내내 팀원 모두가 5분 기록 보드, 트러블슈팅/기능구현 문서화를 꼼꼼히 해줘서 마무리가 편했다.팀장으로서 기록하는 분위기를 초반부터 잘 형성했다. 🥈 협업협업이 정말 힘들었지만, 그만큼 보람찼다. 의견 마찰이 있을 땐 최대한 남의 말을 수용하며 내 의견도 피력하려 노력했다.모든 PR에 리뷰어로 참석하여 이해도를 높였고 덕분에 프로젝트 전반을 잘 이끌어 갈 수 있었다.Jira를 이용하여 팀 전체의 일정을 관리하며 성공적으로 프로젝트를 끝마쳤다. 🥉 완성도기술적인 도전을 많이 할 수 있었다. 단순히 도전보단 해당 기술을 사용했을 때 어떻게 고도화, 안정화시킬까를 고민을 많이 했다.팀원들에게는 기능 구현을 맡기고, 팀원들의 구현 로직을 파악하며 어플리케이션의 전반적인 완성도를 높일.. 2025. 3. 17.
사용자가 엔드포인트를 잘못 입력했을 때, 404를 반환시키자! 사용자가 엔드포인트를 잘못 입력했을 경우 500에러를 출력하는 오류가 있다.보통 다른 웹 사이트들은 404 not found를 출력하기도 하고,500에러가 발생한 경우 grafana에서 slack알림을 보내도록 해놨는데이 오류는 서버에 영향을 주는 오류가 아니라서, 이대로 뒀다간 양치기소년이 될것만같았다GlobalExceptionHandler를 통해 엔드포인트를 잘못 입력했을 경우 500에러를 404로 처리해보자.  application.yml 수정보통 잘못된 엔드포인트 입력으로 예외가 발생하면, No static resource.. 에러로 처리된다. spring boot는 기본적으로 정적 자원(html, css, js, image)을 제공하기 위해 spring-webmvc모듈로 정적 리소스 매핑을 설정.. 2025. 3. 15.
RedisTemplate과의 결합도를 낮춰봅시다 (DIP) DIP란?DIP는 SOLID원칙 중 하나로, 고수준 모듈이 저수준 모듈에 의존하는 것이 아니라 "추상화"된 클래스를 의존하도록 만드는 원칙입니다.스프링에서는 IoC와 DI로 이를 구현할 수 있습니다.DIP를 적용하게 되면, 일반적인 어플리케이션 아키텍처에서 정의하고 있는 패키지 의존성 흐름대로 바꿀 수 있습니다. 예를 들어,현재 우리 서비스의 문제점입니다. Redis를 사용하는 수많은 Application계층의 서비스들이 모두 Infrastructure계층을 바라보며, RedisTemplate에 의존하고 있습니다. 이는 고수준 모듈이 저수준 모듈에 의존하게 되는 것이며 DIP를 위반합니다.이는 유연성을 감소시키고, 테스트를 불편하게 만들며, 모듈 간 결합도가 증가하는 원인이고, 확장성도 떨어지는 설계입니.. 2025. 3. 14.
ALB에 Web Application Firewall 적용하기 개요예전에 서버를 열고 얼마 지나지 않은 시점에(한 한 시간 지났었나?) 해커의 공격을 받은 적이 있었다.누군가가 내 사이트로 php기반 공격을 하려했고.. 심지어 맨 뒤에 Hello라고 했다....그때부터 불안에 떨면서 ALB보안그룹에 우리 팀원들 IP만 열어뒀었는데, 늘 이렇게 숨어 살 순(?) 없었다.web application firewall을 적용해서, 어플리케이션을 안전하게 보호해보자!  AWS WAF 란?Web Application Firewall은 웹 어플리케이션을 보호하기 위해 HTTP/HTTPS 트래픽을 감시하고, 필터링하는 보안 솔루션이다.네트워크 방화벽과는 달리 어플리케이션 계층(7계층)에서 동작하며, 웹 어플리케이션에 대한 공격을 탐지하고 차단해준다.이를 AWS에서 클라우드 기반으.. 2025. 3. 13.
Grafana Alert Rule 설정하기 with Slack 개요현재 어플리케이션의 모니터링-로깅 아키텍처다.모니터링: 프로메테우스로 시계열 데이터를 수집하고, 그라파나로 시각화한다.로깅: fluentd로 logback을 수집하고, elasticsearch로 저장하며, kibana로 시각화한다. 개발자가 하루종일 시각화된 대시보드를 쳐다보고 있을 수는 없다. 자동화된 알림 정책이 필요했고, 우리 팀 슬랙과 연동하게 되었다.  New alert rule(슬랙 연동과정은 생략)처음 보게되는 화면인데 굉장히 난해하다. 하지만 promQL을 몰라도 쉽게 적용할 수 있게 제공되어있다.대시보드로 들어가서 내가 확인하고자 하는 값이 어떤 metric인지 확인하자.난 jvm/500에러로 정했다. edit누르면 메트릭 정보를 볼 수 있다http_server_requests_sec.. 2025. 3. 12.
Fluentd로 로그를 수집하고, ElasticSearch-Kibana로 시각화하자! 로깅의 필요성EC2서버를 오픈하고 한 가지 문제가 있었다.로그를 보고 싶을 때, ec2내부에 굳이 굳이 들어가서 docker logs app을 입력해야 했고에러가 발생한 지점의 로그만 모아서 보고싶은데 cli창에서 스크롤이 끝도 없이 내려가곤 했다. 내가 맞이한 단순한 문제 말고도 운영 단계에서 로깅은 중요하다.사용자의 요청 처리 과정에서 발생하는 다양한 이벤트와 시스템의 상태를 기록함으로써 시스템의 성능을 분석하고, 비정상적인 접근이나 보안 위협을 감지할 수 있다. 또한 운영단계에선 앞서 내가 겪은 문제점 때문에 디버깅이 힘들다.로깅 툴을 사용한다면, 오류가 발생하면 저장된 로그를 분석해 근본적인 원인을 파악하고 해결할 수 있다.  EFK Stack이미 프로젝트에서 elasticsearch, kiban.. 2025. 3. 11.
RefreshToken을 쿠키에 저장하기 기존 방식 개요기존에는 RefreshToken을 Authorization 헤더에 담아서, 프론트엔드에서 서버로 전송하는 방식이었다.@PostMapping("/refresh")public ResponseEntity> refreshAccessToken( @RequestHeader("Authorization") String refreshToken) { return ApiResponseDto.success(authService.refreshAccessToken(refreshToken));}하지만 이 방식에는 문제가 있었다. 1. RefreshToken이 클라이언트 측에서 직접 접근 가능한 문제: XSS공격에 취약하다.XSS공격이란? 크로스 사이트 스크립팅의 약자다. 보안이 취약한 웹사이트에 악.. 2025. 3. 10.
다중 인스턴스용 스케줄러(2) 각종 오류 해결과 리팩토링 문제1. 최신 서버가 unhealthy 하여 롤백 될 수 있음현재 TaskHandler는 메인 서버의 상태가 어떻든 "최신 인스턴스" 라면 Redis에 해당 인스턴스 정보를 등록중이다.헬스체크 로직을 추가해, healthy한 최신 서버만을 redis에 등록하도록 만들었다.이제 최신 서버를 롤백 할 상황이 되어도 정상적으로 스케줄링을 이어갈 수 있다. 만약 healthcheck에 성공했는데도 롤백을 해야한다면, redis에서 key를 삭제하면 된다.  문제2. "특정 시간"에만 스케줄링을 진행하는 로직현재 TaskHandler는 고정 주기만 지원하고 있고, 특정 시간(매일 자정, 6시정각 등등..)에 스케줄링을 진행하는 로직이 없다.전략패턴을 사용해 고정 주기 실행과 특정 시간 실행 로직을 분리했다.다음과.. 2025. 3. 9.
트러블슈팅: 크롤링 시 트랜잭션 범위가 너무 길다 현재 문제점크롤링을 진행하는 메서드 전체에 트랜잭션이 잡혀있다.크롤링 해올 페이지가 적은 상황에선 문제가 안 되지만, 여러 페이지를 한 트랜잭션에 포함시킬 때 문제가 될 수 있다.중간에 한 페이지에서 문제가 생기면 그동안 저장된 모든 데이터도 롤백되므로 결국 전체 크롤링 결과가 날아가게된다.  트랜잭션과 락데이터베이스 시스템에서 트랜잭션과 락(Lock)은 데이터의 일관성과 무결성을 보장하기 위한 핵심 메커니즘이다.  데이터베이스 락은 여러 사용자나 프로세스가 동시에 같은 데이터에 접근할 때 발생할 수 있는 충돌을 방지하기 위한 메커니즘이다. 트랜잭션이 특정 데이터를 처리하는 동안, 그 데이터에 락을 걸어서 다른 트랜잭션의 접근을 제어함으로써 데이터의 일관성을 유지한다.락은 크게 두 가지로 존재하는데, 공.. 2025. 3. 8.