전체 글 90

단일책임원칙에 대한 고민

단일책임원칙은 '클래스는 변경이 일어나야하는 이유가 하나여야 한다'고 말한다. 단일책임원칙을 적용하면 유지보수성이 증가하고 테스트도 쉬워지고 후에 CQRS를 적용할때도 용이하다다만 비밀로그의 퍼블릭 메서드는 최소 100개 이상이다 150~200개 까지 될 수도 있다. 그럼 클래스도 100개 이상 생긴다그런데 모조리 단일책임원칙을 적용하는게 맞을까?어느정도 분리하는건 좋지만 모조리 적용하면 클래스가 너무 많아질 것 같다.클래스란.. 속성과 동작을 정의하며 객체를 생성하기 위한 틀이다. 자바 공식문서에서는 '클래스를 특정 종류의 객체를 구현하는 데 필요한 타입을 정의한다'라고 설명하고있다특정 객체.. 하나의 성격.. 그 성격에 맞는 타입들클래스의 관점에서봐도 단일책임 원칙이 맞아보인다 하지만 현실적으로 클래..

비밀로그 자체 스캐닝 및 공격 (2025년 8월 5일)

ZAP을 이용한 스캐닝과 공격으로 비밀로그의 취약점을 진단했습니다.이 글은 취약점을 해결한 이후에 공개로 전환될 예정입니다. 1. 개요본 보고서는 ZAP(Zed Attack Proxy) 스캔 결과를 바탕으로 작성된 종합 보안 보고서입니다. 비밀로그의 현재 보안 상태를 평가하고 각 문제에 대한 상세 분석과 조치 사항을 작성했습니다.스캐닝 뿐만 아니라 파일취약공격, SQL 인젝션, XSS등 약 30가지 이상의 공격들을 총 2만번 시행했는데 모두 방어할정도로 기본 보안은 나쁘지 않았습니다.하지만 스캐닝에서 검출된 취약점을 보완하겠습니다2. 취약점 요약ZAP 스캔 결과, 총 11개의 경고가 감지되었습니다. 취약점의 리스크 레벨별 분포는 다음과 같으며, 정보성 리스크는 여기 적지 않았습니다.높음(High): 0건..

개발 2025.08.05

DB를 거치지 않은 JWT을 통한 사용자 식별에 관해 (2025년 4월 7일)

2025년 4월 7일의 고민 노션에서 옮겨오고 있습니다. 고민 만약 토큰에 식별자만 넣으면 JWT필터에서 인증객체를 만들기 위해 DB를 조회해야하지 않나?프론트에서는 페이지마다 /userinfo API로 서버에 유저정보를 요청할것이고 서버는 응답으로 유저정보를 반환한다. 그리고 필터는 모든 API요청마다 작동한다.그럼 모든 요청마다 DB를 조회해야하나? 그럼 토큰을 사용하는 의미가 없다.시큐리티컨텍스트홀더를 활용해서 최초한번만 DB를 조회하게하는 방법은 없나?해결 1. 우선 필터에서 DB를 조회하면 안된다. 필터는 서버를 들어오는 요청을 사전에 확인하는 거름망으로 Tomcat 서버의 필터레벨에 스프링 시큐리티의 필터체인이 삽입된다. 스프링의 필터체인에는 JWT필터도 있고 아직 웹 서버에 도착하지 않은 상..

회원가입 기능 설계에 대한 고민 (2025년 3월 29일)

2025년 3월 29일의 고민 노션에서 옮겨오고 있습니다. 고민 카카오 로그인 -> 서비스 회원가입으로 이어지는 흐름에서의 고민이다.1. 프론트 - 카카오 인가코드 받아 백엔드로 전송 (/login/kakao API)2. 백 - 카카오 토큰 발급 요청하고 토큰을 DB에 저장 PK를 DTO에 담아 프론트에 반환3. 프론트 - 서비스 회원가입시 농장이름을 입력하고 DTO에 채우고 백엔드로 전송 (/login/farm API) 문제 - 하나의 API로 회원가입 절차를 끝내고 싶지만 2개의 API를 사용함 서비스 회원가입까지 완료하지 않으면 전체가 롤백되는 일종의 트랜잭션으로 묶고 싶었지만 카카오API라는 외부 API를 호출하기 때문에 어려운 상황 그렇기 때문에 만약 농장이름 입력에서 사용자가 가입포기를 하면 ..

객체와 쿼리최적화에 대한 고민 (2025년 3월 21일)

2025년 3월 21일의 고민 노션에서 옮겨오고 있습니다. 고민 농부 클래스와 농작물 클래스가 있다. 농부는 많은 농작물을 가질 수 있어서 농작물과 농부는 다대일 단방향 매핑을 했다. 외래키는 농작물에 있다.이때 농작물의 좌표를 바꾼다(농작물을 옮겨심는다)라는 기능은 농부 클래스에 있어야 할까? 농작물 클래스에 있어야할까? 농부가 농작물을 옮겨 심는다는게 자연스럽지만 농부 레포지터리에서 농작물 레포지터리에 접근해서 해당 농부가 가지고 있는 농작물을 조회하고 그 농작물의 id를 골라 좌표를 바꿔야한다.농작물에 농작물을 옮겨 심는다는 기능을 넣으면 좀 이상하지만 농작물 레포지터리에서 농작물 id를 찾고 좌표 바꾸면 끝이다.농작물이 무생물이라 조금 헷갈린다 좌표 바꾸는 기능은 농작물 클래스에 넣는게 맞는건가?..

토큰 보안에 관한 고민 (2025년 3월 23일)

2025년 3월 23일의 고민 노션에서 옮겨오고 있습니다. 토큰은 암호화와 복호화가 쉬워서 내용을 해독하기쉽다.예를들어 어떤 웹사이트의 토큰이 userId = 값 형식이라는걸 알았다면 user ID = 32를 넣고 암호화한뒤 토큰에넣고 전송하면 그 사람은 사용자 32의 권한을 가지게 되는 것이 아닐까? 토큰은 앞선 문제 때문에 토큰에는 중요정보를 담지말아야한다. 근데 그럴때 토큰에있는게 user ID = 1 이라면 userId를 url의 파라미터로 사용하면 안되는걸까? 토큰의 서명은 사용자마다 다르기때문에 상관없나? 예를들어 토큰안에 유저Id 5가 있다. 그럼 악성링크를 클릭하여 https://example.com/delete-account?userId=5 에 접속하게 되는 경우가 생길수 있으니 토큰안의..

[골드5] 백준 2467 용액 투 포인터(Java)

이분탐색으로도 풀 수 있다고 하던데 전 투 포인터로 풀었습니다. package org.problem.투포인터;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;// 골드 5 용액// 시간 제한 1초 수는 10만 n(logN)까지 허용public class b2467 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); i..

[골드3] 백준 1238 파티 Java 풀이

package org.problem.다익스트라;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.*;// 골드 3 파티// 문제// N개의 숫자로 구분된 각각의 마을에 한 명의 학생이 살고 있다.// 어느 날 이 N명의 학생이 X (1 ≤ X ≤ N)번 마을에 모여서 파티를 벌이기로 했다. 이 마을 사이에는 총 M개의 단방향 도로들이 있고 i번째 길을 지나는데 Ti(1 ≤ Ti ≤ 100)의 시간을 소비한다.// 각각의 학생들은 파티에 참석하기 위해 걸어가서 다시 그들의 마을로 돌아와야 한다. 하지만 이 학생들은 워낙 게을러서 최단 시간에 오고 가기를 원한다.// ..