"enum" 필드는 공개되어 있지 않고 불변해야 합니다.

enum은 일반적으로 상수로 간주되지만 public 필드로 선언하거나 public setter 가 있는 경우 상수가 아닙니다. enum 필드는 private으로 설정하고 생성자를 통해서만 생성되어야 이상적이지만, 그럴 수 없는 경우 외부에 공개되는 것을 최대한 줄여야 합니다. 규칙을 어긴 코드 public enum Continent { NORTH_AMERICA (23, 24709000), // ... EUROPE (50, 39310000); public int countryCount; // 규칙을 어긴 코드 private int landMass; Continent(int country...

더보기

표준 출력은 무엇이든 로깅하는데 사용하여서는 안 됩니다.

메시지를 로깅할 때 충족하여야 하는 몇 가지 중요한 요구사항이 있습니다. 사용자는 쉽게 로그를 검색할 수 있어야 합니다. 모든 로그의 형식은 사용자가 쉽게 읽을 수 있는 형태여야 합니다. 로깅된 데이터는 실제로 저장되어야 합니다. 민간한 데이터는 안전하게 기록되어야 합니다. 표준 출력을 통해 로깅하는 경우 이러한 요구사항을 준수할 방법이 없습니다. 그렇기 때문에 전용 로거를 사용하는것을 추천드립니다. 규칙을 어긴 코드 System.out.println("My Message"); // 규칙을 어긴 코드 규칙을 준수한 해결책 logger.log("My Message"); 같이보면 좋은...

더보기

암호화 알고리즘은 보안 모드 및 패딩 체계와 함께 사용해야 합니다.

암호화 알고리즘은 데이터 기밀성과 무결성을 보장하기 위해 적절한 경우 보안 모드와 패딩 체계를 사용해야 합니다. 블록 암호 암호화 알고리즘(예: AES)의 경우: ECB(Electronic Codebook) 암호화 모드는 주어진 키 아래에서 주어진 일반 텍스트 블록이 항상 동일한 암호 텍스트 블록으로 암호화되므로 메시지 기밀성을 제대로 제공하지 못합니다. 이 모드는 절대로 사용해서는 안 됩니다. CBC(Cipher Block Chaining) 모드는 그 자체로 데이터 기밀성만 제공합니다. 이 암호화 모드는 패딩과 함께 사용할 경우 패딩 오라클 공격에 취약합니다. 메시지 인증...

더보기

SSL/TLS 연결 중에 서버 호스트 이름을 확인해야 합니다.

중간자 공격에 취약하지 않은 SSL/TLS 연결을 설정하려면 서버가 올바른 인증서를 제공하는지 확인해야 합니다. 인증서의 호스트 이름 관련 데이터는 서버 호스트 이름과 일치해야 합니다. 사용자 지정 호스트 이름 확인을 구현하여 새것을 만들지 않는 것이 좋습니다. TLS/SSL 라이브러리에는 호스트 이름 확인 기능이 내장되어 있으므로 이를 사용해야 합니다. 규칙을 어긴 코드 Python ssl standard 라이브러리: import ssl ctx = ssl._create_unverified_context() # 규칙을 어긴 코드: 기본적으로 호스트 이름 확인은 수행되지 않습니다 ctx = ssl._cre...

더보기

안전하지 않은 임시 파일 생성 방법을 사용해서는 안 됩니다.

안전하지 않은 방법으로 임시 파일을 만들면 애플리케이션이 파일 이름에 대한 경쟁 조건에 노출됩니다. 악의적인 사용자가 애플리케이션보다 먼저 예측 가능한 이름으로 파일을 만들려고 시도할 수 있습니다. 공격이 성공하면 다른 파일이 액세스, 수정, 손상 또는 삭제될 수 있습니다. 애플리케이션이 상승된 권한으로 실행되는 경우 이러한 위험은 더욱 높아집니다. 과거에는 다음과 같은 취약점이 발생했습니다: CVE-2014-1858 CVE-2014-1932 규칙을 어긴 코드 import tempfile filename = tempfile.mktemp() # 규칙을 어긴 코드 tmp_file = open(fil...

더보기

Throwable과 에러는 잡지 않아야 합니다.

Throwable 은 자바에서 모든 에러와 예외의 슈퍼클래스입니다. Error는 모든 에러들의 슈퍼클래스이고 어플리케이션에 의해 잡히지 않습니다. Throwable 또는 Error를 잡게된다면 어플리케이션이 복구 시도하지 않아야하는 OutOfMemoryError 와 InternalError도 잡게됩니다. 규칙을 어긴 코드 try { /* ... */ } catch (Throwable t) { /* ... */ } try { /* ... */ } catch (Error e) { /* ... */ } 규칙을 준수한 코드 try { /* ... */ } catch (RuntimeException e) { /* ...

더보기

매소드 재정의 및 구현에 @Override 를 사용해야합니다.

@Override어노테이션은 다음과 같은 두 가지 이유로 유용하게 사용됩니다. 어노테이션이 달린 메소드가 실제로 매소드 재정의하고 있지 않으면 철자가 틀린 경우처럼 컴파일러를 통해 경고 문구를 발생시킵니다. 메소드가 재정의되었음을 명확하게 나타내여 소스 코드의 가독성을 향상시킵니다. 규칙을 어긴 코드 class ParentClass { public boolean doSomething(){...} } class FirstChildClass extends ParentClass { public boolean doSomething(){...} // 규칙을 어긴 코드 } 규칙을 준수한 코드 cl...

더보기

Deprecated된 항목은 어노테이션과 Javadoc태그를 가지고 있어야한다.

사용 중단된 항목은 @Deprecated 어노테이션과 @deprecated Javadoc 태그 모두 명시하여아합니다. 해당 어노테이션은 IDE와 같은 도구들에게 사용 중단된 요소에 대해 경고를 하고 태그를 통해 언제 사용 중단이 되었는지 왜 되었는지 그리고 어떻게 리팩토링하면 되는지에 대해 설명해줍니다. 규칙을 어긴 코드 class MyClass { @Deprecated public void foo1() { // 규칙을 어긴 코드: @deprecated Javadoc 태그를 추가하는 것이 누락되었습니다. } /** * @deprecated */ public void fo...

더보기