웹
-
[Spring Security] Spring Security의 로그인 과정 씹어먹기 - 인증웹/Spring 2024. 8. 9. 11:25
들어가며... 로그인, 로그아웃 기능은 굉장히 간단해 보이지만 그 기능을 구현하는 방식도 여러가지(단순한 세션 방식, JWT 방식, OAuth2 방식)이고, 회원들의 정보가 저장된 저장소도 제각각이며(In-memory, Redis, Database, ...), 심지어는 회원의 ID, PW를 보내는 HTTP 스키마 마저 자유분방하다(Form-data, Json-data, Http Basic, ...).하지만, 스프링 시큐리티는 이런 자유도 높은 로그인, 로그아웃 구현 방법을 굉장히 세세한 단계로 쪼개어 추상화 했고 그것에 걸맞는 인터페이스를 제공한다. 그 인터페이스들을 구현해 손쉽게 로그인, 로그아웃 기능을 구현할 수 있도록 도와준다. 그러나 워낙 로그인, 로그아웃 기능이 여러가지 방식으로 구현될 수 있..
-
[Spring MVC] @ExceptionHandler와 @ControlAdvice로 예외 처리하기웹/Spring 2024. 7. 31. 22:56
목표사용자 정의 예외 및 Java가 지원하는 예외가 발생했을 때, JSON 형식으로 응답을 반환하는 객체를 작성한다.컨트롤러 코드와 예외 처리 코드를 분리할 수 있도록 한다.JSON 형식의 반환과 더불어 HTTP 코드 응답도 할 수 있는 예외처리 객체를 작성한다. 스프링 예외 처리 과정스프링 MVC 프레임워크가 예외처리를 진행하는 과정은 다음과 같다.컨트롤러 내부에서 예외가 발생한다. - HttpServletResponse.sendError() 메서드 등으로 오류를 전달해도 동일하게 동작만약 컨트롤러 및 필터 등에 try-catch 문이 존재한다면 예외가 잡혀 catch 문 내의 코드가 실행된다.try-catch 문이 없다면 WAS 계층까지 예외가 전파되며, WAS 계층에서는 서버 내부에 문제가 있다고 ..
-
[Spring Security] 데이터베이스에 저장된 데이터를 기반으로 사용자 인증하기 (+ Spring Data JPA)웹/Spring Security 2024. 7. 19. 17:42
Previously on...지난 포스팅에서 무작정 Spring Security를 프로젝트에 도입했고, 인증 API와 비인증 API를 구별하는 작업까지 진행했다. 아직까지는 인증 주체가 존재하지 않아 구축한 인증 API에 인증 할 수 없다. 이번 포스팅에서는 인증 주체인 사용자(ID와 비밀번호)를 데이터베이스에 저장해두고 해당 데이터베이스 값을 활용해 인증하는 로직을 구현해보겠다. 객체, 인터페이스 정리Spring Security가 인증을 진행하는 전체적인 흐름을 살펴보겠다. Spring Security는 여러개의 필터로 이루어져있는데, 전체 필터 아키텍처를 이해하는 것보다는 실제 인증 과정에 사용되는 객체나 인터페이스를 하나씩 톺아보며 공부해보자! AuthenticationToken사용자의 정보와 인증..
-
[Spring Security] Spring Security 맛보기웹/Spring Security 2024. 7. 19. 17:08
보안의 필요성보안은 웹 애플리케이션을 구축할 때 정말 중요한 요소이다. 웹 애플리케이션이 어떤 기능을 제공하냐에 따라 비즈니스 로직을 작성하는 것 이상으로 중요할 수도 있다. 높은 수준의 보안을 유지하기 위해서는 애플리케이션 뿐 아니라 인프라 수준의 보안을 유지하는 것이 필수적이다. 그러나 각 계층에는 각각의 책임이 존재하기 때문에 애플리케이션은 애플리케이션 수준에서 최선의 보안을 제공해야 한다. 인프라의 보안도 마찬가지이다. 애플리케이션의 보안을 철두철미하게 보장한다는 것은 상당히 어려운 일이다. 애플리케이션에게 가할 수 있는 공격은 매우 많으며 시간이 지날수록 새로운 공격법도 창발하기 마련이다. 애플리케이션의 로직을 구현하는데 전념해야할 개발자가 이러한 곳에 신경을 쓴다는 것은 상당한 리소스 낭비이다..
-
Spring Boot 환경에서 컨테이너 테스트 환경 구축하기 w/ Testcontainers웹/Spring 2024. 7. 18. 15:10
테스트 환경 구축의 필요성Spring Boot로 개발하다 보면, 내가 작성한 컴포넌트가 올바르게 동작하는지 테스트 할 필요가 있고, 아예 테스트 기반으로 개발을 해나가는 TDD라는 개념도 존재한다.아직 테스트 코드를 작성하는데 미숙하지만, 테스트 코드가 주는 이점이 상당하다고 생각한다. 그 중 대표적인 것이 개발 생산성 증가인 것 같다. 테스트 코드를 작성하지 않으면 Postman과 같은 API 테스터기로 테스트를 진행해야 하는데, 이것이 여간 생산성을 좀먹는 존재가 아니다. 더군다나 자동화되지 않은 테스트 방식은 휴먼 에러를 불러일으키기도 매우 쉽다. 다만, API를 테스트 할 때 고려해야 할 것이 바로 외부 모듈(대표적으로 DB)이다. 외부 모듈이 항상 같은 반환값을 내주어야 테스트 결과도 일정해지기..
-
[Docker] 컨테이너란? 컨테이너는 왜 사용하는가?웹/Container 2024. 7. 16. 15:24
컨테이너란?컨테이너란, 애플리케이션 코드, 그 코드의 종속성(라이브러리, 패키지), 그리고 런타임을 담고 있는 가상환경이다. 컨테이너를 왜 사용하는가?컨테이너를 사용하지 않고 로컬 개발 환경을 구축한다고 생각해보자. 일반적으로 Node나 Python, Java와 같은 런타임을 설치해야하고, 그것을 활용하는 애플리케이션 코드가 MySQL이나 MongoDB 같은 데이터베이스에 트랜잭션 요청을 보내며 로직을 수행하기 때문에 그러한 데이터베이스도 개발 환경에 설치해야한다. 만약 이러한 프로젝트가 동일한 환경에 여럿 필요하다고 가정해보자. 어떤 프로젝트는 Node20을 사용해야 하고, 어떤 프로젝트는 Node14를 사용해야 하는 등 종속성 문제에 직면하게 된다. 더 나아가 Node20을 사용해 개발하다가 Node..
-
[Trouble Shooting] Hikaripool-1 - Thread starvation or clock leap detected housekeeper delta 오류 해결기웹/Project 2024. 6. 23. 20:41
오류 환경AWS EC2 t2.microAWS RDS MySQL 8스프링 부트 3.2.1스프링 데이터 JPA오류 내용 스프링 부트 애플리케이션을 `t2.micro`에 서빙하고 있었다. 서버를 프로비저닝하고 약 24 시간 내에 CPU 사용율이 99%까지 올라가 크레딧 밸런스(t2.micro는 컴퓨팅 파워를 크레딧이라는 단위로 제공받아 작동한다. 이와 관련해서는 링크 참조)를 모두 소모하고 인스턴스가 다운된다. 인스턴스를 재부팅 해보면, 애플리케이션의 최종 로그에 다음과 같은 로그가 찍혀 있는 것을 확인할 수 있었다. Hikaripool-1 - Thread starvation or clock leap detected housekeeper delta(...) 오류 해결 과정우선, 위 오류가 의미하는 바를 살펴보..
-
[AWS] CloudFront를 Proxy로 활용해 보안 강화하기웹/AWS SAA 2024. 6. 23. 17:11
목표Public Subnet에 위치한 EC2 인스턴스를 CloudFront를 프록시 서버로 활용해 보안을 강화해보자과정기존 아키텍처는 다음과 같다. 기존 아키텍처에는 CloudFront를 거치지 않고 우회해서 Application Server를 접근할 수 있던 문제가 존재했다. CloudFront는 AWS의 CDN 서비스로 캐시 서버의 역할을 하기 때문에, CloudFront만을 통해 Application server에 접근하게 만든다면 다음과 같은 아키텍처를 구현해 일종의 프록시처럼 동작하게 할 수 있다. 위 아키텍처를 구축하기 위해 EC2의 보안그룹을 "CloudFront에서의 트래픽만을 인바운드 허용"하도록 수정하면 된다. 단, CloudFront는 글로벌 서비스이기 때문에 IP 하나만을 인..