얼마전 직렬화(Serialization)에 대한 포스팅 중 무결성, 데이터 무결성 이라는 단어가 나왔습니다.
저도 무결성에 대해 수박 겉핥기 식으로 알고있던지라 다시한번 정리해야겠다는 생각이 들었습니다.
이번엔 이 무결성(Integrity) 에 대해 자세히 알아 보았습니다.
신뢰할 수 있는 서비스 제공을 위해서 의도하지 않은 요인에 의해 데이터, 소프트웨어, 시스템 등이 변경되거나 손상되지 않고 완전성, 정확성, 일관성을 유지함을 보장하는 특성.
정보통신기술(ICT) 분야에서 무결성은 완전하고(complete), 일관되며(consistent), 정확하고(accurate), 믿을 수 있는(trustworthy) 데이터 또는 시스템 등을 표현하는 의미로 범용적으로 사용된다.
인가되지 않은 방법으로 데이터가 손상되거나 소프트웨어 또는 시스템이 조작되지 않는 것을 보장하는 의미로 사용되기도 한다.
출처 http://terms.tta.or.kr/dictionary/dictionaryView.do?subject=%EB%AC%B4%EA%B2%B0%EC%84%B1
항상 그렇듯 사전적 의미도 이해하기 그리 쉬운편은 아닌것같습니다..
쉽게 한마디로 말하자면
'데이터 즉, 변수 혹은 객체 등 데이터를 가지는 모든 대상이 개발자가 의도하지 않은 데이터로 변경되거나 손상되지 않도록 예방하는 것' 을 말합니다.
무결성을 한번이라도 들어보신분들이라면 무결성의 종류가 하나가 아니라 여러개라는것을 아실거라 생각이 됩니다. 그리고 위의 무결성에 대한 정의를 보았을 때, 무결성이 여러곳에서 활용될것이라 짐작할 수 있었을 것입니다. 그렇다면 무결성의 종류에는 어떤것이 있을까요
개체 무결성 : 기본키(Primary key)를 구성하는 속성은 널(NULL) 값이나 중복된 값을 가질 수 없습니다.
널 무결성 : 특정속성 값이 Null이 될 수 없도록 하는 규정
고유 무결성 : 특정 속성에 대해서 각 레코드들이 갖는 값들이 서로 달라야 한다는 규정
참조 무결성 : 외래키 값은 Null이거나 참조 릴레이션의 기본키 값과 동일해야 한다는 규정 즉 릴레이션은 참조할 수 없는 외래키 값을 가질 수 없다는 규정
도메인 무결성 : 특정 속성의 값이, 그 속성이 정의된 도메인에 속한 값이어야 한다는 규정
키 무결성 : 하나의 테이블에는 적어도 하나의 키가 존재해야 한다는 규정
public class ProductDto {
private String name; // 상품명
private int price; // 가격
private String context; // 상품설명
....
}
ProductDto의 변수들 중 가격변수인 price는 음수가 되면 안됩니다.
그런데 만약 price 변수가 private이 아닌 public이라면 누군가가 price 값을 음수로 초기화할 위험이 있습니다.
하지만 위에서 언급했듯 private으로 외부접근을 막고 getter,setter를 이용한다면 그런 위험을 예방할 수 있습니다.
public class ProductDto {
....
public void setPrice(int price) {
if(price > 0) {
this.price = price;
}
}
....
}
이렇게 설정을 한다면 setter로 들어온 값을 체크하여 초기화하기때문에 무결성 보장이 가능해집니다.
간단히 또다른 예를 들어보겠습니다.
우리가 개발을 할때 점검툴을 사용하여 소스 점검을 해보면, 클래스나 파일의 무결성에 대한 취약점이 발견되었다 는 결과가 나올 때가 있습니다.
이 결과에 대한 근거를 보면 클래스가 동적으로 로딩되는 과정에서 다른 클래스로 대체되어 악성코드가 실행될 수 있다는 전제를 볼 수 있습니다.
해당 소스를 보면 보통 Class.forName() 이라는 코드로 클래스를 로드하는 부분이 문제가 되는 경우가 많습니다.
이에 대한 조치방법으로는 Object Checksum이나 File Checksum 을 이용하여 동적 로딩하는 클래스나 파일의 무결성을 점검하는 조치를 해주면 보통 해결이 됩니다.
여기서 checksum이란 파일이나 데이터의 암호화 해쉬 함수라고 하는 해쉬 알고리즘을 이용한 나온 결과인 해쉬코드를 말합니다. 이 checksum을 이용해 기존의 것과 동적 생성에 의해 나온 결과물이 동일한지 무결성을 확인할 수 있습니다. checksum에 대해서는 추후 다시 자세히 다뤄보겠습니다.