9월 4일 - 시큐어코딩

Yullgiii·2024년 9월 4일
0

클린코드와 시큐어코딩

전문가들이 표현한 '클린코드'

  • 한 가지를 제대로 한다.
  • 단순하고 직접적이다.
  • 특정 목적을 달성하는 방법은 하나만 제공한다.
  • 중복 줄이기, 표현력 높이기, 초반부터 간단한 추상화 고려하기 이 세 가지가 비결이다.
  • 코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행하는 것.

클린코드란?

클린코드는 코드를 작성하는 의도와 목적이 명확하며, 다른 사람이 쉽게 읽을 수 있어야 한다. 즉, 가독성이 좋아야 한다.

가독성을 높인다는 것은?

다른 사람이 코드를 봐도, 자유롭게 수정이 가능하고 버그를 찾으며, 변경된 내용이 어떻게 상호작용하는지 이해하는 시간을 최소화하는 것이다.

클린코드를 만들기 위한 규칙

1. 네이밍(Naming)

변수, 클래스, 메소드에 의도가 분명한 이름을 사용한다.

int elapsedTimeInDays;
int daysSinceCreation;
int fileAgeInDays;

잘못된 정보를 전달할 수 있는 이름을 사용하지 않는다. 예를 들어, 범용적으로 사용되는 단어를 사용하면 안 된다. (aix, hp 등)
또한, 연속된 숫자나 불용어를 덧붙이는 방식은 피해야 한다.

2. 주석 달기(Comment)

코드를 읽는 사람이 코드를 작성한 사람만큼 이해할 수 있도록 도와야 한다. 주석은 반드시 달아야 할 이유가 있는 경우에만 작성하도록 한다.

// 주어진 'name'으로 노드를 찾거나 아니면 null을 반환한다.
// 만약 depth <= 0이면 'subtree'만 검색한다.
// 만약 depth == N 이면 N 레벨과 그 아래만 검색한다.
Node* FindNodeInSubtree(Node* subtree, String name, int depth);

3. 꾸미기(Aesthetics)

코드를 보기 좋게 배치하고 꾸며 가독성을 향상시킨다. 규칙적인 들여쓰기와 줄바꿈으로 가독성을 높이고, 일관성 있는 패턴을 적용해 불규칙한 중복 코드를 제거한다.

4. 흐름 제어 만들기(Making Control Flow Easy to Read)

왼쪽에 변수를 두고, 오른쪽에 상수를 둔다.

if (length >= 10)
while (bytesReceived < bytesExpected)

부정이 아닌 긍정을 다루자.

if (a == b) {
    // same
} else {
    // different
}

5. 착한 함수(Function)

함수는 작게, 한 번에 하나의 작업만 수행하도록 작성한다.
예를 들어, 아래의 함수는 추천 수를 변경하는 작업을 수행하는 코드인데, 두 가지 일을 하고 있다.

var voteChanged = function (oldVote, newVote) {
    var score = getScore();
    if (newVote !== oldVote) {
        if (newVote.equals("Up")) {
            score += oldVote.equals("Down") ? 2 : 1;
        } else if (newVote.equals("Down")) {
            score -= oldVote.equals("Up") ? 2 : 1;
        } else if (newVote.equals("")) {
            score += oldVote.equals("Up") ? -1 : 1;
        }
    }
    setScore(score);
};

위의 코드를 별도의 함수로 분리하여 가독성을 향상시킬 수 있다.

var voteValue = function (String vote) {
    if (vote.equals("Up")) {
        return 1;
    }
    if (vote.equals("Down")) {
        return -1;
    }
    return 0;
};

var voteChanged = function (String oldVote, String newVote) {
    var score = getScore();
    score -= voteValue(oldVote);
    score += voteValue(newVote);
    setScore(score);
};

이제 훨씬 깔끔한 코드가 되었다!


코드 리뷰 & 리팩토링

  • 코드 리뷰를 통해 냄새나는 코드를 발견하고, 리팩토링을 통해 점진적으로 개선해 나간다.
  • 코드 인스펙션을 통해 개발 표준에 위배되었거나 잘못 작성된 부분을 수정한다.

리팩토링 대상

  • 메소드 정리: 그룹으로 묶을 수 있는 코드, 수식을 메소드로 변경.
  • 객체 간의 기능 이동: 메소드 기능에 따른 위치 변경, 클래스 기능을 명확히 구분.
  • 데이터 구성: 캡슐화 기법 적용해 데이터 접근 관리.
  • 조건문 단순화: 조건 논리를 단순하고 명확하게 작성.
  • 메소드 호출 단순화: 메소드 이름이나 목적이 맞지 않을 때 변경.

시큐어 코딩

시큐어 코딩이란 안전한 소프트웨어를 개발하기 위해, 소스 코드에 존재할 수 있는 잠재적 보안 약점을 제거하는 것을 말한다.

보안 약점을 노려 발생하는 사고 사례들

  • SQL 인젝션으로 인한 개인정보 유출
  • URL 파라미터 조작으로 인한 민감한 정보 노출
  • 무작위 대입 공격으로 인한 정보 유출

SQL 인젝션 방지 예시

안전하지 않은 코드:

String query = "SELECT * FROM users WHERE userid = '" + userid + "' AND password = '" + password + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);

안전한 코드:

String query = "SELECT * FROM users WHERE userid = ? AND password = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setString(1, userid);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();

시큐어 코딩을 통해 적절한 검증 작업을 수행하고 안전하게 처리할 수 있다.


So...

클린 코드는 가독성이 좋고 유지보수가 쉬운 코드로, 협업 시 빠르게 문제를 찾고 수정할 수 있게 도와줍니다. 이를 위해서는 네이밍, 주석, 흐름제어, 함수 작성 방법 등에 신경 써야 합니다.
또한, 시큐어 코딩을 통해 보안 약점에 대비한 코드를 작성하여 안전한 소프트웨어 개발이 가능해집니다. 클린 코드와 시큐어 코딩의 원칙을 지키며 소프트웨어를 작성하는 것은 개발자의 중요한 의무입니다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글