2009년 7월 27일 월요일

정보의 자살

보안(security)만큼 프라이버시(privacy)에 대한 논의도 많은 요즘.

프라이버시는 결국 데이터의 축적(archiving)이 그 이유라고 생각해.
데이터가 축적되지 않으려면 어떻게 해야 될까?

데이터에 시한 폭탄을 달 수 있을까? 그래서 자살하는거야. 축적되지 않도록.
하지만 데이터라는 것은 코드에 의해서 다루어지는 성질의 것이니 스스로 자살한다는 것이 말이 안 되지 않나.

예전, 자바 코어 책에서 이런 것을 봤었는데,
프로그램 = 알고리즘 + 데이터
오브젝트(객체) = 데이터 + 알고리즘
이라고 생각하라고 하더라고.
그 때 받아들이기로는 데이터에 더 무게를 준 것이구나 정도로 생각했었는데, 객체지향이라는 것이 데이터가 더 능동적으로 행동할 수 있도록 해줄 수 있는 것이 아닌가 생각되더라.

그렇다면 모든 데이터를 객체 안에 담고(encapsulation) 사용을 하되 자살 루틴이 포함되면 된다는 것인데,
사용할 때마다 특정 프로시져를 구동해야 하도록, 데이터를 얻고자하는 루틴, 즉, getter/setter에 필요한 루틴을 강제시키는 것이 일단 보기에 간단한 해결책일 수 있지.
문제는 코드를 강제한다는 것이 쉬운 것이 아니니 말이야. 얼마든지 우회할 수 있는 길이 있겠지.

우선의 설계는,

1) 반드시 데이터를 사용할 때 initiation을 해야 한다.
2) 데이터를 사용할 때 get을 해야 얻을 수 있다. get할 때마다 시간이 점검되어 expire되면 자살하거나, 사용 회수를 점검하여 자살한다. (zero나 random string으로 자신을 채워 자살할 수 있겠지)

다음은 perl로 구현해본 코드.

privateData.pl



use strict;

package main;

my $data_instance = PrivateData->new("Top Secret");
print "First Try: ", $data_instance->get(), "\n";
print "Second Try: ", $data_instance->get(), "\n";
print "Third Try: ", $data_instance->get(), "\n";

0;

package PrivateData;

sub new {
my ($self, @args) = @_;
my $obj = {
_data => $args[0],
_used => 0,
_limit => 1,
};
bless $obj, $self;
return $obj;
}

sub get {
my ($self) = @_;
$self->_data_used();
$self->_suicide() if $self->_expired();
return $self->{_data};
}

sub _data_used {
my ($self) = @_;
$self->{_used}++;
}

sub _expired {
my ($self) = @_;
return ($self->{_used} > $self->{_limit}) ? 1 : 0;
}

sub _suicide {
my ($self) = @_;
$self->{_data} = "Trash";
}

1;

__END__

결과는 다음과 같다.

First Try: Top Secret
Second Try: Trash
Third Try: Trash

동일한 세 번의 코드이지만 다른 결과를 얻을 수 있다.
객체의 힘이고, 객체지향을 알고 있는 사람에게는 당연한 소리지만, 노출되면 곤란한 데이터(private data)를 다루기에 좋은 모델임은 틀림없다.

당연한 소리를 관점만 살짝 바꾸어 이야기하고 나니 뭔가 부끄럽네.