다운로드 사이트 
http://dag.wieers.com/rpm/packages/ngrep/

사용법

ngrep은 접속 호스트별, 포트별, 장비별 패킷 확인이 가능하다.

- 특정 IP의 80 포트로 통신하는 패킷 확인 방법
# ngrep -v -qt host 123.123.123.124 and port 80
 
- 오라클(특정 포트 : 1521)로 전송되는 SQL 등을 확인할 때
# ngrep -qx dest port 1521
- 특정 IP의 80 포트를 제외한 패킷 확인 방법
# ngrep -v -qt host 123.123.123.124 and not port 80

ngrep 옵션(별 필요성을 못느끼는 옵션.. ^^)
-t : 시간 표시
-x : 16진수 표시
-d device : device 표시
-i : grep 처럼 대소문자 무시


4. ngrep
마지막으로 살펴볼 프로그램은ngrep이라는 프로그램이다.
ngrep은 network grep의 의미로서,홈페이지
(http://www.packetfactory.net/projects/ngrep/) 또는 http://rpmfind.net/에서 rpm 버전으
로 다운로드 가능하다. ngrep은 앞에서 언급한 tcpdump나 snort와 비슷한 기능을 제공하
지만 snort와 같이 설치과정이 복잡하지도 않고 바이너리 파일만 복사해서 바로 사용할 수
있을만큼 가벼워서 모니터링시 유용하게 사용 가능하다.
사실, 개인적으로는 tcpdump나 snort보다 이 프로그램을 더욱 많이 사용하고 있는데,역시
기본적으로 BPF도 제공한다.몇 가지 유용한 기능을 예와 함께 살펴보도록 하자.
 
# ngrep -qi -c 80 port 80
T 221.xxx.68.251:3414 -> 211.47.xx.xx:80 [AP]
GET /tt/site/skin/member/CONNECT_LIST/SITE_CONNECT_LIST/images/title_all.gi
f HTTP/1.1..Accept: */*..Referer: http://test.tt.co.kr/tt/site/ttmember.c
gi?act=connect_list..Accept-Language: ko..Accept-Encoding: gzip, deflate..I
f-Modified-Since: Tue, 21 Feb 2006 06:19:41 GMT..If-None-Match: "2a4043-77-
43fab0fd"..User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; M
axthon; i-NavFourF; InfoPath.1; .NET CLR 1.1.4322)..Host: test.tt.co.kr..
Connection: Keep-Alive..Cookie: WRITE=store_user_info=0&; X2VID=Z4402067
F93; oldserver=done; _home_test_public_html_tt_site_
SESSION_ID=ee641d3190188207f3320f075f1c2b10....
위의 경우 port 80번에 대한 패킷을 캡처한 것으로 패킷의 상세한 내용까지 보여주고 있는
것을 알 수 있다. 여기에서 -c 80은 출력되는 컬럼의 폭을 80자로 제한하여 가동성을 높이
기 위한 설정이다.

# ngrep -qwi 'user|pass' port 110
T 211.47.xx.xx:2502 -> 211.47.xx.xx:110 [AP]
USER antihong..
T 211.47.xx.xx:110 -> 211.47.xx.xx:2502 [AP]
+OK User name accepted, password please..
10.2.3.4:110 -> 10.2.4.39:1763 TCP TTL:121 TOS:0x0 ID:22164 IpLen:20
DgmLen:40
***AP*** Seq: 0x2B9D2415 Ack: 0x6405A45C Win: 0x16D0 TcpLen: 20
2B 4F 4B 20 50 4F 50 33 20 73 74 61 66 66 73 2E +OK POP3 mail.
74 74 2E 63 6F 2E 6B 72 20 76 32 30 30 31 2E 37 server.com v2001.7
38 72 68 20 73 65 72 76 65 72 20 72 65 61 64 79 8rh server ready
0D 0A
T 211.47.xx.xx:4567 -> 211.47.xx.xx:110 [AP]
PASS sdlkjlfsdf.
이는 port 110번에 대한 패킷 중 대소문자에 관계없이(-i) ‘user’또는 ‘pass’라는 문자열
이 보이는 패킷만을 보여주는 것으로, 특정한 문자열만을 캡처해서 보고자 할 때 유용하게
사용할 수 있다.

# ngrep -tW byline port 80
#
T 2006/03/13 17:30:16.416882 222.xxx.xx.254:4767 -> 211.47.xx.xx:80 [AP]
GET /tt/site/skin/member/CONNECT_LIST/SITE_CONNECT_LIST/images/bt_profile.gif
HTTP/1.1.
Accept: */*.
Referer: http://test.tt.co.kr/tt/site/ttmember.cgi?act=connect_list.
Accept-Language: ko.
Accept-Encoding: gzip, deflate.
If-Modified-Since: Tue, 21 Feb 2006 06:19:41 GMT.
If-None-Match: "2a403f-1eb-43fab0fd".
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; i-NavFourF).
Host: custom.tt.co.kr.
Connection: Keep-Alive.
Cookie: WRITE=store_user_info=0&; main_ttnews_276_no_popup=20060116;
X2VID=Z43D56FAC3AF43; main_ttnews_281_no_popup=20060208;
Recruit200603=done; oldserver=done;
_home_test_public_html_tt_site_SESSION_ID=9796a3f30d4473ca6c7382e8a7ab42b6.
.
##
T 2006/03/13 17:30:16.418319 211.47.xx.xx:80 -> 222.235.xx.xxx:4767 [AP]
HTTP/1.1 304 Not Modified.
Date: Mon, 13 Mar 2006 08:30:16 GMT.
Server: Microsoft-IIS/5.0.
Connection: Keep-Alive, Keep-Alive.
Keep-Alive: timeout=15, max=99.
ETag: "2a403f-1eb-43fab0fd".

위와 같이 -t 옵션을 추가하면 패킷이 캡처되는 시간이 함께 보이고, -W byline을 추가하
면 앞에서와 달리 캡처되는 내용들이 한 줄에 나열되지 않고 항목에 따라 여러 줄에 나누어
보여주므로 패킷을 분석하는데 편리하게 사용가능하다.
추가적으로, ngrep에 대한 자세한 내용은 ngrep --help를 참고하기 바라며 패킷 캡처와
관련하여 생각해 볼만한 이슈가 두 가지가 있는데, 만약 패킷 캡처된 내용을 별도의 파일에
저장하고자 할 경우에는 어떻게 하여야 할까?
이러한 경우 각 프로그램에서 자체적으로 제공하는 별도의 저장 옵션을 이용해도 되고 간단
히 ngrep > cap.txt와 같이 실행하여도 된다.
아울러, 패킷 캡처시 시스템에 부하를 유발하지는 않지만 패킷 캡처를 장기간 지속적으로
실행할 경우 패킷 캡처 자체가 부하를 유발할 수도 있으므로 주의하기 바란다.

출저 : http://www.linuzer.net/zbxe/?document_srl=1776

'System > Linux' 카테고리의 다른 글

lsof , fuser, pgrep 명령어  (0) 2011.09.30
top 명령어  (0) 2011.09.27
clock, date, rdate, ntpdate  (0) 2011.08.22
linux - grep, egrep, fgrep  (0) 2011.08.05
linux - UID, EUID  (0) 2011.07.26
Posted by linuxism
,

Hash and MAC

Security/Common 2011. 9. 18. 11:35
출처 - http://blog.naver.com/dury00/130044978311

Hash and MAC
  • Hasing

    • 원래는 테이블 내 탐색, 삽입, 삭제를 상수 시간내에 효과적으로 이루어지게 하는 탐색 기법
    • 특정한 키를 받아들여 그 키로만 매칭할 수 있는 레코드의 위치를 반환 가능
  • 암호학적으로 유용한 해시 함수의 요건

    • 강한 충돌 회피성 : x != x' 이면서 h(x) = h(x')을 만족하는 x, x' 을 찾는 것이 계산적으로 불가능
    • 어떠한 크기의 데이터 블록이든지 적용 가능해야 하고
    • 고정 길이의 output(message digest) 생성
    • message diagest로부터 원래 message를 구할 수 없는 일방향성
  • 해시 알고리즘

    • SHA

      • 메시지를 512bit 블록으로 맞추기 위해 패딩 및 메시지 원래 길이값을 추가
      • 512bit 블록으로 나눈 후 160bit의 초기 백터와 각 블록을 SHA 함수에 입력하면 변형된 160bit의 백터가 출력되고, 이를 다시 다음 블록과 함께 입력하는 과정을 반복하면 마지막에 나온 160bit 의 메시지 다이제스트 생성
      • 각 SHA iteration 과정

      • 512bit 의 블록을 16개의 워드(W1~W16)로 나누고 초기 백터 또한 5개의 워드(A-E, H0-H4)로 나눈 후
        H4=H3, H3=H2, H2=S 30(H1), H1=H0, H0=TEMP
        TEMP = TEMP = S5(H0) + ft(H1,H2,H3) + H4 + Wt + Kt

        (Kt 는 80개의 상수 단어 열)

      • 이러한 과정을 80번 반복하며, 이때 1~16라운드까지는 W1~W16의 값을 사용하나 17라운드부터는
        Wt = S1(W(t-3) XOR W(t-8) XOR W(t-14) XOR W(t-16)) 를 이용하여 구한다.
    • MD5

      • 메시지 다이제스트 길이 128bit
      • 블록 길이 512bit
      • 각 iteration 당 64라운드
  • 메시지 인증코드

    • 비밀키 기반의 인증코드 : 비밀키로 메시지 다이제스트를 암호화해서 보낸 후, 수신자측에서는 받은 메시지의 다이제스트를 만들고 인증코드를 복호화하여 비교
    • 공개키 기반의 인증코드 : 개인키로 메시지 다이제스트를 암호화해서 보낸 후, 수신자측에서는 받은 메시지의 다이제스트를 만들고 인증코드를 공개키로 복호화하여 비교
    • 공유 비밀키 방식의 인증코드 : 메시지에 비밀키를 추가하여 메시지 다이제스트를 만들어서 보낸 후, 수신자측에서는 수신된 메시지에 비밀키를 추가하여 메시지 다이제스트를 만들어서 인증코드와 비교, HMAC
  • HMAC (keyed-Hash Message Authentication Code)

'Security > Common' 카테고리의 다른 글

CISSP에서 도구  (0) 2011.11.10
암호학(Cryptography) 의 모든 것  (0) 2011.10.06
API Gateway 사례로 본 HMAC 인증 이해  (0) 2011.10.01
시만텍 “보안 빨간불, 주범은 APT”  (2) 2011.09.24
커버로스 (Kerberos)  (0) 2011.09.23
Posted by linuxism
,
출처 - http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=38206

읽을거리 > 디벨로퍼 플러스

Go 프로그래밍 언어 - Go의 탄생

앞으로 3회에 걸쳐 Go언어에 대해 소개하고자 한다. 첫 회는 Go언어의 탄생과 관련된 이야기로 시작한다. 다음으로는 다른 개발언어를 사용하고 있는 개발자도 쉽게 익힐 수 있도록 Go언어만의 특징을 비교해서 소개할 예정이다. 마지막으로 Go언어의 핵심이라 할 수 있는 동시성(Concurrency)에 관한 내용을 다룬다. 이 글을 통해 Go언어의 특징을 이해하는 데 도움이 됐으면 하는 마음이다.

신제용 jeyong@gmail.com|LG전자에 근무하며 SW개발자의 역량향상을 위한 교육 및 코칭을 주업무로 하고 있다. 최근에는 Go언어를 익히면서 시간을 보내고 있다. 사내외에서 Go언어 관련 세미나를 진행하며 Go언어를 확산시키기 위해 노력 중이다.

Go 프로그래밍 언어(Go Programming Language)는 Google에서 만든 개발언어다.

Hello Go World!
“Hello World!”를 화면에 출력하는 것은 우리가 새로운 언어를 접할 때 가장 먼저 시도하는 예제 중 하나다. 우리도 동일한 방법으로 Go언어에 첫 발을 디뎌보자. 현재 PC 앞에 없어도 상관없다. 스마트폰으로도 가능하다. PC나 스마트폰을 이용해 웹브라우저를 실행한 후 다음 단계를 순서대로 따라해 보자. 웹브라우저 주소창에 http://golang.org를 입력하고 해당 사이트로 이동한다. 

<화면 1> 왼쪽 하단의 박스에 소스가 보일 것이다. 해당 소스를 컴파일하고 실행하려면 <COMPILE & RUN> 버튼을 누르면 된다. 눌러보자. 바로 밑에 파란색으로 결과가 보일 것이다. 
이렇게 Go언어로 된 “Hello World!” 프로그램을 컴파일하고 실행한 후 그 결과를 확인했다. 

이번에는 각자의 이름을 입력해서 실행해 보자. “Hello, 제용”처럼 말이다(<화면 2> 참조). 여러분도 각자 자신의 한글 이름을 입력하고 <COMPILE & RUN> 버튼을 눌러 결과를 확인해 보자. 

웹페이지에서 Go 컴파일 & 실행

<화면 1> Go 컴파일 & 실행

<화면 2> Go 코드 수정 후 컴파일 & 실행

Go가 탄생하기까지
2007년 어느 화창한 가을날 샌프란시스코 근처 구글 사무실. 화이트보드를 앞에 두고 세 사람이 모여 있다. 나이 지긋하고 수염을 기른 범상치 않은 외모의 사람이 뭔가를 화이트보드에 쓰고 있다. 그 외 두 사람은 뚫어지게 화이트보드를 보면서 깊은 생각에 잠겨 있다.

잠시 후 이들은 각자 생각한 것을 화이트보드에 그림으로 그리기도 하고 중간 중간 다른 사람과 이견이 있는 부분에서는 목소리 톤을 높이기도 한다. 이들은 지금 무엇을 하고 있는 걸까?
이 세 사람은 앞으로 이들이 만들 새로운 개발언어에 대해 이야기하고 있다. 새로 태어날 개발언어가 어떤 모습이어야 할지에 대해 각자가 지금까지 경험한 것을 바탕으로 의견을 나누고 있는 것이다. 이렇게 새로 태어난 언어가 지금 우리가 알고 있는 Go언어이며, 열띤 토론을 진행 중인 세 명의 개발자는 로버트 그리스머(Robert Griesemer), 켄 톰슨(Ken Thompson), 롭 파이크(Rob Pike)다.

개발 중간에 두 명의 멤버가 더 보강된다. 그 중 이안 테일러(Ian Taylor)는 Go언어를 GCC 컴파일러에 적용하는 일을, 러스 콕스(Russ Cox)는 개발팀에 합류해 Go의 완성도를 높이는 일을 담당하게 된다. 

릴리즈된 이후로 세계 각지의 개발자들이 Go언어의 버그를 리포팅하고 필요한 라이브러리를 만들어 공유하면서 Go언어가 성장하고 확산되는 데 최선을 다하고 있다. 구글 내부에는 개발자 애드버킷(developer advocate)이라는 직무가 있다. 각 분야마다 개발자 애드버킷이 있고 그 직무를 맡으면 세계를 돌면서 구글 외부에 해당 분야를 홍보하며 구글 내외부를 소통시키는 역할을 한다. Go언어의 개발자 애드버킷은 앤드류(Andrew Gerrand)가 맡고 있다. 필자도 앤드류에게 몇 번 메일을 보낸 적이 있다. 그는 항상 친절하고 질문에 간단명료하게 답해준다.

Go를 만든 사람들
NBA.com에서 기념행사로 역대 NBA 최고의 10팀을 뽑았다. 매해 각 팀이 달성한 기록이 최고의 팀을 선정하는 기준이 됐다. 어떤 해의 어떤 팀이 최고의 팀에 뽑혔는지를 간략히 설명하고 그 해에 거둔 승률을 표기해 뒀다. 시카고 불스는 두 번이나 역대 최고의 10팀에 이름을 올렸다. 조던이 은퇴하기 전(1991~1992)과 조던이 몇 년 뒤 복귀하고(1995~1996) 나서다. 공통점은 두 번 모두 마이클 조던과 단짝 동료들 그리고 감독 필 잭슨이 함께 했을 때의 팀이라 것이다.

이 이야기를 꺼낸 이유는 Go언어를 개발한 팀과 NBA의 드림팀인 시카고 불스가 비슷한 점이 있기 때문이다. Go언어 개발팀은 벨 연구소(Bell Labs)에서 최고였고 B, C언어 개발 이후 켄 톰슨이 다시 돌아왔다는 것이다.

먼저 켄 톰슨은 유닉스의 아버지로 유명하다. 유닉스를 만든 공로로 SW 분야의 노벨상이라 할 수 있는 튜링상(Turing Award)를 수상하기도 했다. 또한 유닉스 초기버전까지는 혼자 개발했을 정도로 뛰어난 실력의 개발자다. 이후 유닉스는 발전을 거듭하면서 서버 운영체제와 맥OS로 널리 사용되고 있다. 유닉스에 필요한 개발언어를 구상하면서 그는 B언어(1969)를 만들게 된다. 그 후 데니스 리치가 B언어를 개선해 C언어(1972)를 만든다. B언어와 C언어의 관계를 유추할 수 있는 예로 처음 나왔을 때 ‘New B’라는 이름을 사용하다가 이후 C로 명명됐다는 것을 들 수 있다. 그리고 켄 톰슨과 데니스 리치는 같은 벨 연구소를 다니면서 실제로 C를 개발할 때 많은 도움을 주고 받았다고 한다.

<그림 1> 켄 톰슨과 데니스 리치(출처:위키피디아)

롭 파이크는 국내에서는 프로그래밍 수련법(원서 <The Practice of Programming>)의 저자로 더 잘 알려져 있으며 현재 널리 사용되고 있는 UTF-8을 개발했다. 이 외에 분산 운영체제를 개발했고 개발언어와 관련해서는 동시성을 지원하는 개발언어인 NewSqeak을 개발한 경력이 있다.

로버트 그리스머는 썬(Sun Microsystems)에서 자바 핫스팟 컴파일러(Java HotSpot compiler) 개발과 크롬 브라우저에서 자바스크립트 엔진 개발에 참여했다.

러스 콕스는 프로그래밍 신동이다. 인상적인 부분은 1997년도 인터뷰에서 러스 콕스를 ‘수년 동안 세계 최고 수준 컴퓨터 프로그래머’로 소개한 점이다. 이미 대학 진학 전에 세계 최고 수준의 프로그래머로 인정받은 것이다. 이는 USACO(USA Computing Olympiad) 및 IOI(International Olympiad in Informatics)에 미국을 대표해 출전한 이력 때문이기도 하다. 운영체제, 컴파일러, 알고리즘 등 다양한 분야에 논문을 쓰기도 했다.

특히 켄 톰슨, 롭 파이크, 러스 콕스 이렇게 세 명은 벨 연구소에서 이미 함께 개발한 경험이 있고 롭 파이크와 로버트 그리스머는 2005년에 구글 직원으로서 공동으로 논문 작업을 한 인연이 있다. 벨 연구소에서 Plan 9을 개발한 세 명이 한자리에 모였고 모두 각자의 분야에서 세계 최고 수준의 개발자들로 최고의 프로그래밍 언어를 만들겠다는 하나의 목표를 위해 뭉쳤다. 조던 복귀 후 시카고 불스가 누렸던 영광을 Go언어 개발팀도 재현할 수 있을까? 이를 지켜보는 것도 농구경기 만큼이나 흥미진진하고 재미있다. 또 Go언어가 얼마나 빠른 시간 내에 확산될지를 예상해 보는 것도 관전 포인트가 되겠다.

Go 탄생 후
Go가 정식으로 세상에 나온 것은 2009년 11월이다. 그 이후 지금(2011년 9월)까지 Go와 관련해서 어떤 일들이 있었는지 알아보자.

Go언어 출시와 함께 다양한 매체에서 Go 탄생에 대해 뜨거운 관심을 보였다. 대부분 ‘구글이 만든 개발언어’라는 제목의 기사들이다. 우호적인 내용도 있지만 그렇지 않은 내용도 있었다.

Like It!

CNET이나 SWITCHED에서는 구글의 새로운 개발언어에 대한 소개와 향후 기대에 대한 기사를 실었다. 구글이 내부 천재 개발자들을 모아 새로운 개발언어를 만들어냈다는 찬사를 보내기도 했다. 놀라운 사실은 Go언어가 나온 바로 그 해 2009년에 TIOBE가 Go언어에게 올해의 개발언어상을 수여했다는 것이다. Go언어가 2009년 11월에 나왔다는 사실을 떠올려보면 정말 나오자마자 수상한 것이며 그 해에 Go에 대한 관심이 얼마나 뜨거웠는지를 미루어 짐작할 수 있다.

I Don’t Like It!

Go언어를 접한 일부 개발자들은 자신의 블로그나 기사를 통해 ‘이건 뭐야. 뭔가 색다른 게 없잖아!’, ‘로드맵에 대한 명확한 설명이 없어’, ‘문법이 왜 이래’ 등의 불평을 했다. 그들은 이미 나온 개발언어들이 제공하는 기능 이상의 뭔가를 기대했다. 하지만 깜짝 놀랄 만한 무엇인가를 발견하지 못했고 따라서 기대에 못 미친다는 반응을 보인 것이다. 상용으로 Go언어를 적용하려는 개발자들에게 Go언어의 로드맵이 정확히 제공되지 않아 일부 개발자들은 답답함을 토로하기도 한다. 로드맵은 아직까지도 명확하게 제공되지 않고 있다. 또 C나 자바를 사용하는 개발자들은 처음 Go언어의 문법을 접하면 현재 나와 있는 여러 언어들의 문법을 섞어놓은 듯한 느낌을 받았다고 하며 C와는 다른 표현 때문에 코드 읽기가 쉽지 않다고들 말한다. 

시스템 개발언어를 넘어
Go언어가 처음 설계되던 때부터 출시 이후 지난해까지 공식적인 발표자료를 보면 Go언어가 목표로 삼은 것은 시스템 개발 분야다. 구체적으로 Go를 개발한 사람들이 프리젠테이션에서 밝힌 예상 적용가능 분야는 다음과 같다.

- 웹서버
- 웹브라우저
- 웹로봇
- 검색엔진
- 컴파일러
- 프로그래밍 도구(디버깅 도구, 분석 도구 등)
- IDE(통합개발환경)
- 운영체제

C와 비슷한 성능을 내면서 C/C++로 개발돼 온 분야를 대체할 수 있다는 설명이다. 하지만 올해부터 나온 발표자료에서는 시스템 개발에 한정되지 않고 다양한 용도의 개발에 활용할 수 있다는 설명이 추가돼 있다. 실제로 출시 후 1년간 사용해 보니 일반 개발언어(General Purpose Language)로 사용해도 손색이 없다고 주장한다. 구글 앱 엔진(Google App Engine)에 사용돼 다른 앱 엔진 개발 지원 언어인 파이썬, 자바와 어깨를 나란히 한 것을 보면 과장된 표현은 아닌 것 같다. 또 Go언어를 만든 롭 파이크는 “내가 써 본 개발언어 중에서 가장 생산성이 높다”라고 자신 있게 말하기도 했다.

구글 서비스와의 결합

<그림 2> 구글 I/O 2011

올해 구글 I/O 2011 행사에서 Go언어와 관련한 깜짝 소식이 전해졌다. 바로 구글 앱 엔진에서 Go언어를 지원한다는 것이다. 구글 앱 엔진은 파이썬, 자바 이렇게 두 개 언어만을 지원하고 있었는데 여기에 Go언어를 추가하겠다는 발표였다. Go언어가 세상에 나온 지 1년 반 만에 구글 서비스와 결합하게 된 사건이다. 과연 언제쯤 Go언어가 상용으로 사용될까, 구글이 언제쯤 자신이 만든 언어로 자신의 서비스를 활용할 수 있게 할 것인가에 대해 의견이 분분했었다. 구글 I/O 2011 행사에서의 발표는 이런 불확실한 미래에 대한 의문에 명확한 답변이 됐다. 처음 타깃을 구글 앱 엔진으로 잡은 것은 다른 구글 서비스에 비해 안전성을 확보하기 위한 작업을 쉽게 진행할 수 있기 때문인 것으로 풀이된다. 안드로이드나 크롬 관련 제품에 바로 탑재하기에는 아직 Go언어의 신뢰성이나 완성도가 확보되지 않은 상태이기 때문이다. 특히 ARM을 지원하는 Go언어의 버전이 아직 작업 중이기 때문이기도 하다. 

구글 I/O 2011에서 보여준 구글 서비스와의 연동이 개발자들에게 깊은 인상을 심어준 것은 확실한 것 같다. 구글 I/O 2011 행사 이후 Go언어 관련 문서가 눈에 띄게 늘면서 잘 정리되고 있으며 개발자들의 참여 또한 가파른 상승세를 보이고 있다. Go언어를 이용한 프로젝트 등록건수도 급증하는 추세다.

구글과 Go
공식적으로 Go언어는 구글에서 만들었다. 하지만 필자가 Go언어 홈페이지에 올라온 글들을 번역해 본 결과 구글에 대한 언급을 찾아보기 힘들었다. 문서에서도 최대한 구글에 대한 언급을 자제하는 분위기다. 외부 기사에서 알려주는 구글과 Go언어의 관계에 대한 설명이 없다면 아마도 그 관계를 파악하지 못할지도 모른다. Go언어가 오픈소스 프로젝트 형태로 진행되기 때문에 구글이 일종의 Go언어 개발 스폰서 같은 느낌을 주기도 한다.

구글은 왜 시스템 프로그래밍 언어를 만들었을까? 구글은 왜 이토록 새로운 개발 언어를 필요로 했을까? 물론 이에 대한 답은 구글 전략 책임자만이 알 것이다. 하지만 현재까지 주변 정황들을 통해 독자들이 직접 판단해 보는 것도 재미있겠다.

구글은 세계 최고 수준의 개발자를 모았다. 단순한 재미나 실험적인 프로젝트를 맡기기에는 멤버가 너무 화려하다. 동네 조기 축구 경기를 위해서 호날두, 루니와 같은 선수를 영입하지는 않을 것이라는 추측은 누구나 가능할 것이다. 그렇다면 Go언어를 구글이 직접 사용하려는 의도가 있었다는 가정 하에 생각해 보자. 앞에서 밝힌 바와 같이 처음부터 Go는 시스템 프로그래밍 언어를 목표로 설계됐다. 그렇다면 구글의 서비스 중에서 시스템 프로그래밍 언어가 필요한 분야에는 어떤 것이 있을까? 알다시피 구글은 파이썬의 창시자인 귀도 반 로썸(Guido van Rossum)을 직원으로 두고 있다. 파이썬과 중복되는 인터프리트(interpret) 방식 개발 언어를 원하지는 않았을 것이다. 그렇다면 시스템 프로그래밍 언어가 쓰이면 좋을 분야가.... 아! 그러고 보니 올해 구글 I/O 2011에서 크롬 OS를 탑재한 크롬북이 출시됐다. 또 구글 I/O 2011에서 가장 많은 세션을 할당했던 안드로이드가 있다. 안드로이드에서 자바로 작성한 앱은 애플의 아이폰 앱에 비해 성능이 떨어진다는 지적이 많다. 개발자들도 구글에 뭔가 성능을 높일 수 있는 방법의 제공을 끊임없이 요구하고 있다. 특히 구글의 계획에 의하면 연말에는 애플과 같이 핸드폰, 태블릿, TV의 안드로이드 플랫폼을 하나로 통합할 예정이라고 한다. 

최근 구글을 가장 괴롭히는 것은 특허분쟁이다. 특히 가장 곤혹스럽게 만드는 부분이 안드로이드의 달빅(Dalvik)에 들어가 있는 자바관련 기능이다. 썬을 인수하자마자 오라클이 바로 구글을 상대로 안드로이드에서 자바 기술에 대해 라이선스를 얻지 않고 무단으로 사용했다며 제소한 상태다. 피해액으로 오라클이 주장하는 금액은 10억~60억 달러 정도이며 해외 언론에서는 오라클이 좀 더 유리한 입장이라고 한다. 빠르면 몇 달 뒤 결정이 난다고 하니 누가 웃고 울게 될지가 궁금하다. 개발언어를 갖고 있지 않을 경우 자사의 서비스를 하루 아침에 중단해야 할 수도 있다는 경험은 SW 분야에서 세계 최고 기업 구글에게는 다시 겪고 싶지 않은 경험일 것이다.

<그림 3> 구글과 오라클 특허 전쟁

개발자와 Go
타임머신을 타고 필자가 처음 회사생활을 시작한 2000년대 초로 가보겠다. 그 당시 MS는 그 누구도 대항할 수 없는 회사였다. 운영체제 시장의 대부분을 차지했고 개발업무도 윈도우를 기반으로 한 일이 대부분이었다. 당시 MS는 프로그래밍 언어 전문가들을 모아 C#이라는 개발언어를 시장에 내놓았고 공식적으로 C#을 적극 지원하겠다는 메시지도 함께 보냈다. 그래서 개발자라면 앞날을 대비해 C# 관련 서적 1~2권쯤은 책장에 뒀던 시절이다. 물론 예전 이야기이고 지금은 상황이 많이 변했다. MS의 힘이 전보다는 많이 약화됐고 그 자리를 구글과 애플이 나눠가졌다고 할 수 있다. 

필자의 하루를 살펴보면 안드로이드폰에서 울리는 알람으로 잠을 깨고, 지메일(Gmail)로 메일을 확인하고 지톡(gTalk)으로 친구들과 이야기를 나누며 구글 캘린더로 일정을 관리한다. 개발관련 자료는 구글 검색을 통해 얻는다. 결국 구글의 서비스 안에서 하루하루를 살아가고 있다고 해도 과언이 아니다. Go언어는 이런 구글이 발표한 개발언어다. Go언어가 아직 완성된 상태가 아니더라도 향후 영향력이 커질 것이라는 판단을 할 수 있다. 필자의 10년 전과 같이 현재 개발자라면 이제는 Go언어 관련 서적 1~2권쯤은 책장에 꽂아둬야 하지 않을까?

시대요구

‘내가 지금 이 세상을 살고 있는 것은 21세기가 나를 간절히 원했기 때문이야’                           - 조용필의 킬리만자로의 표범 중에서

시스템 개발 환경에 초점을 두고 이야기해 보자. 현재의 개발환경은 C언어가 처음 나온 40년 전과 많이 달라졌다. 따라서 꼭 Go언어가 아니더라도 현재 개발환경에 적합한 개발언어가 필요하다. 과거와 달라진 현재의 개발환경에 대해 알아보고 이를 지원하기 위한 Go언어의 특징도 함께 살펴보자. 현재 개발환경의 특징을 요약하자면 아래의 다섯 가지로 말할 수 있다.

1. 개발속도(하드웨어 개발 vs 소프트웨어 개발)
2. 모듈화를 위한 의존성
3. 동적타입 언어의 속성을 가진 언어
4. 가비지 콜렉션(Garbage Collection)
5. 병렬처리(Parallelism)

하드웨어 관련 법칙 중에 가장 많이 인용되는 것이 무어의 법칙이다. 마이크로칩에 저장할 수 있는 데이터의 양이 매년 또는 적어도 매 18개월마다 두 배씩 증가한다는 법칙이다. 1965년 강연에서 고든 무어가 예상한 것이다. 8비트부터 64비트까지, 또 싱글코어에서 듀얼코어를 지나 쿼드코어까지 하드웨어는 다양하게 발전해 왔다. 하지만 정작 이 하드웨어의 성능을 제대로 낼 수 있도록 하는 소프트웨어 개발 발전의 속도는 더디기만 하다. 개발언어의 탓으로 돌리기에는 무리가 있겠지만 적어도 현재 하드웨어를 지원할 수 있게 설계된 시스템 프로그래밍 언어의 필요성은 충분히 공감할 것이다. Go언어에서 강조하는 것 중에 하나가 멀티코어 환경을 고려해서 설계했다는 것이다. 앞으로 나올 다른 개발언어들도 현재의 하드웨어 환경을 지원하는 기능이 기본으로 탑재되길 바란다.

현대 개발언어의 특징 중에 하나는 모듈화가 쉬워야 한다는 것이다. 모듈화를 쉽게 하기 위해 의존성(dependency)과 컴파일 속도는 중요한 요소다. 파일 수가 500개 이상인 규모의 C/C++언어로 개발하는 프로젝트에 참여한 경험이 있는 개발자라면 빌드 시간에 얽힌 추억들이 꽤 있을 것이다. 이런 경험들을 재밌게 표현한 <컴파일(Compiling)>이라는 제목의 만화도 있다.

<그림 4> 컴파일(Compiling)

C언어에서 컴파일 시간이 많이 소요되는 이유 중에 하나는 실제 빌드에 필요하지 않은 파일에 접근해서 읽는 작업 때문이다. 따라서 C/C++언어에서 기본 헤더파일을 포함하는 경우 컴파일 시 얼마나 많은 파일에 접근해서 작업이 수행되는지에 대한 실험결과를 소개하려고 한다. <표 1>은 맥OS X 10.5.8에서 gcc4.0.1을 이용해 테스트한 결과다(Go 프리젠테이션 자료를 참고했다). C언어의 컴파일에서 나타나는 의존성은 모듈화를 어렵게 하는 요소 중에 하나다. 또 단위 테스트와 같이 빠른 피드백을 얻어야 하는 경우 컴파일에 소요되는 시간이 길어져 피드백을 받는 주기도 함께 길어진다. 모듈화를 어렵게 할 뿐 아니라 개발자의 단위 테스트를 힘들게 만드는 환경요소라 할 수 있다. 그렇다면 Go에서는 어떻게 이 문제를 해결할까? <리스트 1>의 “Hello World” 소스에서 import “fmt”의 경우 fmt 모듈 한 개만 참조한다. go의 의존성과 빌드에 대해 간략히 소개하자면 다음과 같다.

· 의존성 가정 : a.go → b.go → c.go (A → B : A는 B에 의존성을 가진다.)
· 빌드순서 : c.go, b.go, a.go(순서대로 빌드) 
· Go의 의존성 : a.go를 빌드하는 경우 b.go만 참조한다.

<표 1> C/C++ 컴파일 시 의존성 테스트

대표적인 동적언어로는 파이썬과 자바스크립트를 꼽을 수 있다.    

동적언어의 속성은 개발코드가 간결해지고 개발자의 귀찮은 코딩작업을 최소화시켜 개발자에게 재미를 주는 요소이기도 하다. 하지만 동적언어는 정적언어처럼 에러 발생을 사전에 검증하는 처리가 부족해서 실제로 해당 코드가 실행될 때 에러에 직면하게 된다는 문제가 있다. 따라서 안전성이 보장되지 않는다는 단점을 갖고 있다. 실제로 Go는 정적타입언어(statically typed language)이지만 동적타입언어(daynamically typed language) 속성을 지원하도록 설계됐다. 컴파일 시점에 컴파일러에 의해 지원되는 것이 특징이다. 따라서 정적언어 타입의 특징인 안전성을 가지면서 동시에 동적언어가 주는 코딩의 재미를 함께 취할 수 있다.

C 개발자를 가장 골치 아프게 하는 것들에는 포인터와 메모리 할당 및 해제가 있다. 포인터에 관한 문제점의 싹을 제거하기 위해 포인터는 제공하되 포인터 연산은 제공하지 않는다. 메모리 할당 및 해제에 대해 가비지 콜렉션(Garbage Collection)을 제공하는 경우 메모리 해제에 대해 개발자가 신경쓰지 않아도 된다. 특히 동시성(Concurrency) 관련 개발을 할 때 메모리 할당과 해제는 개발을 어렵게 하는 요소다. 동시성을 언어 차원에서 제대로 지원하기 위해서는 가비지 컬렉션이 반드시 필요하며 Go언어는 가비지 콜렉션을 완벽하게 지원한다. 물론 자바도 지원하는 기능이다. 하지만 자바의 경우 VM(Virtual Machine)에서 제공하는 것과 달리 Go언어에서는 빌드돼 나온 결과 파일에서 이를 지원한다는 것이 차이점이다.

최근 안드로이드 기기의 트렌드 중에 하나는 듀얼코어다. 물론 앞으로 두 개 이상의 코어를 갖는 기기가 기본 스펙으로 자리 잡을 것으로 예상된다. C/C++은 멀티코어를 고려해서 설계된 개발언어가 아니다. 당연히 40년 전에 존재하지도 않는 멀티코어를 미리 고려해서 언어를 설계할 수는 없었다. 그러므로 C/C++로 병렬처리가 가능한 프로그램을 작성하는 데는 많은 노력이 든다. 멀티코어 환경에서 개발할 경우 단순히 하드웨어의 병렬처리뿐만 아니라 소프트웨어 레벨에서 동시성도 함께 고려해야 한다. Go언어는 설계 단계에서 멀티코어를 지원하는 개념을 도입했다. 멀티코어 환경에서 안전하고 쉽게 개발할 수 있는 방법을 제공한다.

Go의 뿌리를 찾아서 
Go언어는 공식적으로 C계열이다. 어찌 보면 당연하다. B언어와 C언어를 만들었던 켄 톰슨이 Go언어를 만들었고 현재 가장 널리 사용되는 언어가 C이므로 이를 완전히 뒤집고 새로운 형태의 언어를 만드는 것이 어렵기도 하고 효용도 적을 것이기 때문이다. Go언어를 만든 멤버들은 C언어를 기반으로 현존하는 개발언어들의 장점을 의미 있게 접목하는 일을 하고 싶었다. 일부 문법은 파스칼(Pascal)에서 빌려왔으며 Go언어의 중요 특징인 동시성은 Newsqueak의 영향을 받았다. Newsqueak은 역시 Go언어를 만든 멤버 중에 한 사람인 롭 파이크의 작품이기도 하다. Newsqueak은 C와 CSP의 영향을 받았고 C언어 문법에서 동시성을 지원하는 언어를 만들려는 롭 파이크의 오랜 연구의 결과이기도 하다.

<그림 5> Go 팀원들의 전문기술 분야

<그림 6> Go에 영향을 준 언어들

마치며
Go 웹사이트에 올라온 자료와 사내외에 Go언어를 알리기 위한 발표자료를 만들면서 얻은 정보들을 필자 나름대로 분류해서 정리해 봤다. 이번 글의 목적은 개발자뿐 아니라 IT 트렌드에 관심이 있거나 연구개발 회사에서 관리업무를 담당하는 사람들도 쉽게 읽을 수 있는 글을 작성하는 것이었다. 실제 필자가 사내외에서 발표를 할 때도 Go언어에 대한 개괄적 이해를 돕는 세션과 개발자를 위한 세션을 따로 진행하기도 했다. 직접 개발을 하지 않는 관리 담당자도 쉽게 Go언어의 특징을 파악할 수 있었다는 피드백을 참고해 기획해 본 것이다. 소스 코드와 Go언어의 문법적 특징과 같이 실제 개발에 필요한 지식을 원하는 개발자라면 다음 2회부터의 글을 기대하면 좋겠다. 

지금까지 Go언어에 관한 첫 번째 이야기를 요약하자면 최고의 개발자들을 모아 Go언어를 만든 구글과 40년 만에 C언어의 업그레이드로 등장한 Go언어가 주요 내용이었다. 향후 Go언어가 주류 언어가 될 것인지, 어떤 방향으로 발전해 나갈 것인지에 대해서는 기사를 읽은 독자의 판단에 맡긴다.

참고자료
1. http://golang.org Go 프로그래밍 언어 웹사이트
2. http://en.wikipedia.org/wiki/Ken_Thompson  켄 톰슨
3. http://en.wikipedia.org/wiki/Rob_Pike 롭 파이크
4. http://www.tiobe.com TIOBE
5. http://golang.kr Go프로그래밍언어 문서 한글화 작업 페이지
6. http://en.wikipedia.org/wiki/Go_(programming_language) Wikipedia Go언어
7. http://en.wikipedia.org/wiki/50_Greatest_Players_in_NBA_History NBA 역사상 Top 10 Teams
8. http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs Plan 9 운영체제
9. http://xkcd.com/ 웹코믹스. ‘컴파일(Compiling)‘ 만화 이외에도 개발자들이 공감할만한 만화가 많다.
10. http://news.cnet.com/8301-30685_3-10393210-264.html CNET Go 출시 기사
11.  http://downloadsquad.switched.com/2009/11/11/go-go-google-gopher-go-google-invents-its-own-programming-la/ SWITCHED Go 출시 기사
12. http://en.wikipedia.org/wiki/Newsqueak Newsqueak 프로그래밍 언어

Posted by linuxism
,