1. 도입우리는 우리의 보안 목표가 무엇인지 알고 있고, 우리가 강제하고자 하는 보안 정책에 대한 최소한의 일반적인 감을 잡았으며, 우리의 정책을 위반할 수도(혹은 위반하지 않을 수도) 있는 다양한 시스템 서비스를 요청하는 주체가 누구인지에 대한 증거를 가지고 있다. 이제 우리는 그 정보를 가져와서 소프트웨어가 우리를 대신해 수행할 수 있는 실질적으로 실행 가능한 무언가로 전환해야 한다.여기에는 두 가지 중요한 단계가 있다:해당 요청이 우리의 보안 정책 내에 적합한지 판단한다.적합하다면 작업을 수행하고, 그렇지 않다면 작업이 수행되지 않도록 확실히 보장한다.첫 번째 단계를 일반적으로 접근 제어(Access Control)라고 부른다. 우리는 어떤 시스템 자원이나 서비스가 어떤 주체에 의해, 어떤 방식으로..
OSTEP의 최신? 버전에 포함된 Security를 학습하기로 스터디에서 결정했다. 내가 가진 책에는 포함된 내용이 아니라 https://pages.cs.wisc.edu/~remzi/OSTEP/ PDF에서 제공하는 자료로 학습을 진행한다.1. 복숭아로 이해하는 보안의 3대 요소 (CIA)OSTEP에서는 보안의 3대 요소를 복숭아에 비유해 설명한다. 우리가 가진 소중한 자원을 복숭아라고 생각한다면 보안은 다음 세가지를 지키는 것이라고 한다.1. 기밀성 (Confidentiality)비유: 내가 잠시 고개를 돌린 사이, 누군가 내 복숭아를 훔쳐가는 것을 원치 않는 것.정의: 오직 인가된 사용자나 시스템만이 자산에 접근할 수 있도록 보장하는 것.컴퓨터에서: 개인의 비밀번호, 신용카드 정보, 민감한 개인 파일 ..
지난 포스팅까지 우리는 데이터를 저장하는 Repository와 비즈니스 로직을 수행하는 Service를 구현했다. 하지만 이 코드들은 아직 내 컴퓨터 안에서만 동작할 뿐, 외부 세상(프론트엔드, 앱)과는 단절되어 있다.이번에는 클라이언트의 요청을 받아 서비스 계층으로 연결해 주는 컨트롤러(Controller) 를 구현하고, 들어오는 데이터를 안전하게 검사하는 유효성 검증(Validation) 과정을 다룬다.1. 컨트롤러의 책임: "선은 넘지 말자"초보 개발자가 흔히 하는 실수 중 하나는 컨트롤러에 비즈니스 로직을 넣는 것이다. 컨트롤러는 "교통 정리"만 해야 한다.해야 할 일 (O): HTTP 요청받기, 입력값 검증(@Valid), 서비스 호출, HTTP 상태 코드(200, 201, 400...) 결정...
지난 포스팅에서 Testcontainers를 이용해 데이터 접근 계층(Repository)의 신뢰성을 확보했다. 이제는 이 데이터를 가공하여 실제 비즈니스 로직을 수행하는 서비스(Service) 계층을 구현할 차례다.1. DTO 설계: Entity를 밖으로 노출하지 마라서비스 계층의 첫 단추는 데이터를 주고받을 그릇(DTO)을 만드는 것이다. Entity를 컨트롤러 파라미터로 직접 받으면, 원치 않는 필드가 변경되거나 스펙 변경 시 DB 구조까지 흔들리는 부작용이 있다.Java 17의 record를 사용하여 불변(Immutable) DTO를 만들었다.public record MemberSignupRequest( @NotBlank String email, @NotBlank Stri..