본문 바로가기

Java

SQL Injection 취약점 개선 📌 SQL Injection 취약점 개선 외 조치 정리 (보안 개선 사례)1. SQL Injection 취약점 개선🔴 문제MyBatis에서 ${} 사용으로 사용자 입력이 SQL에 직접 삽입됨AND B.MBER_NM LIKE '%${searchKeyword}%'AND B.HNF_NO_TMP IN (${hnfNoTmp}) 🟢 개선#{} 바인딩으로 PreparedStatement 적용IN 절은 로 안전하게 처리AND B.MBER_NM LIKE CONCAT('%', #{searchKeyword}, '%')AND B.HNF_NO_TMP IN #{item} 💡 핵심 포인트${} → 문자열 치환 (취약)#{} → 바인드 변수 (안전)2. LIKE / REGEXP 검색 시 보안 처리🔴 문제와일드카드 및 정규식.. 더보기
JSP + JavaScript 환경에서 XSS 방어 실패 원인과 해결 📌 JSP + JavaScript 환경에서 XSS 방어 실패 원인과 해결1. 문제 상황JSP에서 ${ajaxId} 값을 JavaScript 및 HTML에 전달 및 hidden input 사용했음에도 XSS 방어 실패예:ajaxId: '' 2. 원인 분석🔥 (1) 컨텍스트 불일치 (핵심 원인)은 HTML escape만 수행하지만 아래는 JavaScript 문자열 컨텍스트'${ajaxId}' 👉 HTML escape ≠ JavaScript escape→ XSS 방어 실패🔥 (2) EL 직접 출력 (${ajaxId}) EL은 escape 없음악성 값 삽입 시 그대로 DOM에 반영🔥 (3) 서버 측 검증 부재ajaxId에 대한 제한 없음예:"> 👉 escape 이전에 입력 자체를 신뢰하면 안 됨3... 더보기
모달 팝업 내 동적 테이블 UI 정렬 문제 해결 📌 모달 팝업 내 동적 테이블 UI 정렬 문제 해결1. 문제 상황 (Problem)모달 팝업 내부에서 div 기반 테이블 UI 구현.div_th (헤더 영역) 높이가 서로 달라 UI가 깨짐.div_td 내용 길이에 따라 줄바꿈이 비정상적으로 동작 이름 종류 2. 원인 분석 (Root Cause)🔹 1) 높이 불일치각 .div_th는 콘텐츠 길이에 따라 height가 자동 결정됨동일 row 내에서도 높이가 다르게 렌더링됨🔹 2) 높이 측정 실패 (0 문제)팝업이 display: none 상태에서 실행offsetHeight = 0 발생🔹 3) 줄바꿈 문제긴 텍스트 또는 공백 없는 문자열 → overflow 발생기본 CSS로는 강제 줄바꿈이 .. 더보기
엑셀 다운로드 버튼 클릭 후 다른 버튼 동작 이상 문제 해결 📌 엑셀 다운로드 버튼 클릭 후 다른 버튼 동작 이상 문제 해결🧩 문제 상황동일한 을 사용하는 화면에서키워드 검색지역 조회엑셀 다운로드총 3개의 버튼 존재엑셀 다운로드 버튼 클릭 이후→ 다른 조회 버튼 클릭 시에도 엑셀 다운로드가 실행되는 문제 발생🔍 원인 분석엑셀 다운로드 시 아래 코드로 form.action을 변경form.action = "/welfare/listWelExcavateExcel.do";form.submit();문제는:한 번 변경된 form.action이 유지됨이후 다른 버튼 클릭 시에도 동일한 action으로 submit됨👉 즉, form 상태 오염(side effect) 발생💡 해결 전략❌ 기존 방식 (문제 발생 구조)하나의 form을 모든 버튼이 공유특정 버튼에서 form .. 더보기
엑셀 다운로드 기능 구현 및 안정성 개선 📌 엑셀 다운로드 기능 구현 및 안정성 개선1. 문제 상황기존 목록 조회 기능에서 검색 조건 기반 엑셀 다운로드 기능이 필요했다.단순 다운로드가 아니라 다음 조건을 만족해야 했다:사용자 검색 조건 유지페이징 무시 (전체 데이터 다운로드)추가 필터 (지역, 정렬, 목적 등) 반영초기 검색 키(initialKey) 대응2. 구현 방식✔️ Form 기반 POST 요청으로 엑셀 다운로드 처리 form.action = "/welfare/listWelExcavateExcel.do";form.method = "post";form.submit();GET 방식이 아닌 POST 방식을 사용하여파라미터 길이 제한 회피복잡한 검색 조건 전달 가능✔️ 검색 조건 동적 세팅form.searchKeyword.value = key.. 더보기
JSP EL vs <c:out> 차이 및 XSS 대응 정리 JSP EL vs 차이 및 XSS 대응 정리1️⃣ 문제 배경JSP 화면 개발 중 게시글 제목을 출력할 때 아래 두 가지 방식이 혼용되고 있었다. ${article.articleTitle} value="${article.articleTitle}"/> 겉보기에는 동일하게 동작하지만, 보안 및 출력 처리 방식에서 중요한 차이가 존재한다.2️⃣ 기술적 차이 분석🔹 1. EL(Expression Language) 직접 출력 ${article.articleTitle} 단순히 객체의 프로퍼티 값을 출력null일 경우 아무것도 출력하지 않음HTML escape 처리 없음사용자 입력값 포함 시 XSS 취약 가능성 존재예시: 위 값이 DB에 저장되어 있다면 브라우저에서 그대로 실행될 수 있음.🔹 2. JSTL .. 더보기
JSP/JSTL에서 파일명 확장자 제거 처리 📌 JSP/JSTL에서 파일명 확장자 제거 처리 (마지막 . 기준)1️⃣ 문제 상황파일 다운로드 영역에서 원본 파일명(atchmnflOrginlNm)을 화면에 출력해야 했다. ${fn:replace(atchmnflInfo.atchmnflOrginlNm, ext, '')} 기존 로직은 ext 값을 이용해 확장자를 제거하는 방식이었지만, 다음과 같은 문제가 있었다:파일명에 .이 여러 개 포함될 수 있음archive.tar.gzreport.final.docxfn:substringAfter()는 첫 번째 . 기준으로 동작JSTL에는 lastIndexOf() 함수가 존재하지 않음즉, “마지막 . 기준으로 확장자 제거”를 EL만으로 처리하기 어려운 상황이었다.2️⃣ JSTL 함수의 한계JSTL fn 함수에서 제.. 더보기
java16.stream.aggregate /* 집계(count(),sum(),average(),max(), min()...) 집계(aggregate)는 최종처리기능으로 요소들을 처리해서 갯수, 합계, 평균, 최대/최소값 등과 같이 하나의 값으로 집계하는 기능을 말한다. 집계는 대용량의 데이터를 가공해서 축소하는 reduction이라고 볼 수 있다. 스트림이 제고하는 기본집계 메서드는 1. count() : 요소의 갯수를 long타입으로 리턴 2. findFirst() : 첫번째 요소를 OptionalXXX타입으로 리턴 3. max(Comparator) : 요소중 최대요소를 OptionalXXX타입으로 리턴 4. min(Comparator) : 요소중 최소요소를 OptionalXXX타입으로 리턴 5. average() : 요소들의 평균값을 Opt.. 더보기