본문 바로가기

프로그래밍

(91)
logback 보안 업데이트 / log4j2 JNDI Lookup 취약점 관련 조치 log4j2 JNDI Lookup 취약점 이미 2021년 한 해를 뜨겁게 장식했던 매우 심각한 취약점이다. 우리 프로젝트에서는 log4j2를 직접 사용하지 않고 spring-boot-starter-logging 모듈을 통해 logback을 사용하고 있는데, Spring 공식 블로그에는 다음과 같이 안내하고 있으므로 별다른 조치를 취하지 않았다. Apache Log4j 보안 업데이트 권고(CVE-2021-45105, 44832) (Update. 22-1-3 14:30) Log4J2 Vulnerability and Spring Boot Spring Boot users are only affected by this vulnerability if they have switched the default loggi..
No thread-bound request found No thread-bound request found 오류 RequestContextHolder에서 request를 가져오려는데 다음과 같은 오류가 발생했다. HttpServletRequest httpServletRequest = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the o..
정규식 - XSS방지 EL에서 JSTL <c:out escapeXml="true"/> 변환 꿀팁 XSS 방지를 위해 필터가 사용하지만, 이런저런 사연으로 EL을 JSTL c:out으로 변경하라는 요청이 왔다. 하나씩 찾아 바꾸기에는 너무 노동집약적인 작업이라 다음과 같이 정규식을 사용하였다. 찾을 값 (정규식 사용!) (\$\{.+?\})변경할 값 ${title} 같은 값이 로 바뀐다.
맥에서 '로케일을 인식할 수 없습니다' 오류 (MacOS, DB접속, 오라클 접속, 톰캣 실행 시 오류) 로케일을 인식할 수 없습니다 맥OS가 업데이트를 하고 나면 항상 발생하는 오류이다. DB (오라클 등) 접속할 때, 로컬에서 톰캣 실행할 때(DB 접속하면서) 등등... 항상 발생하는 오류인데 왜 안고쳐지는지 모르겠다. 해결방법 시스템 환경설정에 들어간다. 언어 및 지역 선택 지역을 다른곳으로 바꿨다가 다시 대한민국으로 바꾼다. 다시 실행해보면 잘된다.
모바일 브라우저에서 안드로이드 앱 실행시 주의할 점 스마트폰 브라우저에서 웹페이지로 접속시 안드로이드 앱으로 이동시키려고 한다. 앱 개발 커스텀 scheme을 사용하여 리다이렉트 시켰다. 안드로이드 앱 실행이 동작하지 않는다. 알고보니 안드로이드는 보안상 사용자의 제스쳐 없이 앱을 실행하는 것을 금지하고 있다. setTimeout 함수를 사용하여 1~3초 정도 시간을 두고 실행시키면 된다. $(function(){ // document ready if (!앱에서접속) { var scheme = 'customScheme://redirect?url=' + location.pathname; if (ios) { locadtion.href = scheme; } if (android){ // 2초 후 이동 setTimeout(() => { locati..
코드값을 유니크로 만들어야 하는 이유 시스템 개발을 하다 보면 보통 공통 코드라는 것을 만들어 사용하게 된다. 공통 코드 테이블은 부모-자식 테이블로 분리할 수도 있지만, 하나의 코드 테이블에 상위코드 같은 컬럼을 만들기도 한다. 어쨋든 코드는 대개 계층형(hierachy) 구조를 가진다. 그리고 DB에서 관리한다. 그런데 코드를 정의할 때 001, 002 이딴 식으로 정의하는 경우가 간혹 있다. 그런데 해당 코드와 뭔가 처리해야 할 변경사항이 생겼다? 전체 소스코드에서 Find all 해서 문자열 검색을 할텐데, 이 코드가 A의 하위코드 001인지 B의 하위코드 001인지 일일히 소스를 분석해봐야 알 수 있다. 마스터코드를 상세코드의 접두사로 사용하거나, 변수명처럼 의미있는 문자의 조합으로 만들면 적어도 이런 상황은 피할 수 있다. 그럼 ..
각주구검 하듯 만드는 이벤트 주소(URL) 월 단위로 진행하는 이벤트가 있다. 기존에 URI가 이런 식으로 만들어져 있었다. /event/something/v1 /event/something/v2 /event/something/v3 ... URI 마지막에 붙는 버전은 PathVariable로, jsp 파일명의 접미사로 사용되고 있었다. 그런데 여기에는 쪼끄맣고 귀여운 문제가 있었다. 버전이 무엇을 의미하는지 모호하다. 이벤트 참여유도 푸시 발송에 해당 URL이 함께 나가는데, 푸시발송 시 URL 부분은 하드코딩이다. 이벤트를 새로 진행할 때마다 변경해야 한다. 사용자 앱 내 메뉴 링크를 변경해야 한다. 이벤트 팝업을 설정하는 기획자가 매번 URL을 개발자에게 확인해야 한다. 새로운 이벤트가 진행되면 하드코딩을 수정해야하는 곳이 최소 3개이다. 그..
Spring @Scheduled cron 표현식은 년도를 설정할 수 없다 (Cron expression must consist of 6 fields (found 7 in &quot;cron expression...&quot;)) 문제 목표: 이벤트 당첨자에게 올해 3~12월 10달 동안 매월 쿠폰을 발급해야 한다. 그래서 쿠폰 발급 프로세스를 Batch 프로젝트에 추가하고 크론은 다음과 같이 설정하였다. // 2021년 3~12월 매달 1일 새벽 1시 30분 실행 @Scheduled(cron = "0 30 3 1 3-12 ? 2021") 그런데 배치 프로젝트 실행 시 이런 오류가 발생했다. Cron expression must consist of 6 fields (found 7 in "0 30 3 1 3-12 ? 2021")원인 Spring @Scheduled 크론은 6자리 설정만 허용한다.(연도 설정 불가) 참고 링크: https://docs.spring.io/spring-framework/docs/current/javadoc..