Experience/SK Shieldus Rookies
[secolab] SW 구현단계에서의 49개 보안약점 (6)
얀 짱
2026. 8. 13. 09:08

잘못된 세션에 의한 데이터 정보노출
다중 스레드 환경에서 싱글톤 객체 필드에 경쟁조건이 발생할 수 있는 보안약
-> Java 서블릿과 같은 다중 스레드 환경에서는 정보를 저장하는 멤버 변수가 포함되지 않도록 하여, 서로 다른 세션에서 데이터를 공유하지 않도록 해야 한다.
💡 보안 대책
---
싱글톤 패턴을 사용하는 경우, 변수 범위에 주의를 기울여야 한다.
특히 Java에서는 HttpServlet 클래스의 하위클래스에서 멤버 필드를 선언하지 않도록 하고, 필요한 경우 지역 변수를 선언하여 사용한다.






제거되지 않고 남은 디버그 코드
디버깅 목적으로 삽입된 코드가 남겨진 채로 배포될 경우,
공격자가 식별 과정을 우회하거나 의도하지 않은 정보와 제어 정보가 노출될 위험이 있는 보안약점
-> 디버그 코드는 설정 등의 민감한 정보를 담거나 시스템을 제어하게 허용하는 부분을 담고 있을 수 있다.
💡 보안 대책
---
소프트웨어 배포 전, 반드시 디버그 코드를 확인 및 삭제한다.
일반적으로 Java 개발자의 경우
웹 응용프로그램을 제작할 때 디버그 용도의 코드를 main()에 개발한 후 이를 삭제하지 않는 경우가 많다.
디버깅이 끝나면 main() 메소드를 삭제해야 한다.




public 메소드부터 반환된 private 배열
private 으로 선언된 배열을 public 메소드로 반환하면,
해당 배열의 레퍼런스가 외부에 공개됨으로써 외부에서 배열 수정과 객체 속성 변경이 가능해지는 보안약
💡 보안 대책
---
private으로 선언된 배열을 public으로 선언된 메소드로 반환하지 않도록 해야 한다.
private 배열에 대한 복사본을 반환하도록 하고
배열의 원소에 대해서는 clone() 메소드로 복사된 원소를 저장하도록 하여 private 선언된 배열과 객체 속성이 의도하지 않게 수정되는 것을 방지한다.
만약 배열의 원소가 String 타입 등과 같이 변경이 되지 않는 경우에는 private 배열의 복사본을 만들고 이를 반환하도록 작성한다.






private 배열에 public 객체 데이터 할당
public으로 선언된 메소드의 인자가 private로 선언된 배열에 저장되면,
private 배열을 외부에서 접근하여 배열 수정과 객체 속성변경이 가능해지는 보안약
💡 보안 대책
---
public으로 선언된 메서드의 인자를 private 선언된 배열로 저장되지 않도록 한다.
인자로 들어온 배열의 복사본을 생성하고
clone() 메소드로 복사된 원소를 저장하도록 하여
prvate 선언된 배열과 객체 속성이 의도하지 않게 수정되는 것을 방지한다.
만약 배열 객체의 원소가 String 타입 등과 같이 변경이 되지 않는 경우에는 인자로 들어온 배열의 복사본을 생성하여 할당한다.





