삽질의 현장/- .NET

#070_닷넷(.NET)_.Net Framework 기본 - 어셈블리 (공유 어셈블리)

shovelman 2015. 11. 10. 17:02



안녕하세요 삽잡이입니다.


이번 시간에는 공유 어셈블리에 대해서 알아보려고합니다.




이처럼 '강력한 이름 키'를 만들게 되면





'.snk' 확장자 명으로 파일이 하나 만들어집니다.

해당 파일은 암호화 알고리즘에 의해 만들어진 파일입니다.

 

이는 강력한 이름 키 파일입니다.

우리가 뭔말인지 알아보지는 못하겠지만, 현재 '성명 키'를 생성하게 된것입니다.

 

보안에 사용되는 알고리즘 중 '공개키, 비밀키' 알고리즘이라는 것이 있습니다.

MD5라던지, RSA 알고리즘에서 사용되지요.

아무튼... 해당 파일은 공개키, 비밀키에 의해 만들어진 코드 값입니다.

 

닷넷에서 제공해주는 '강력한 이름'에는 다섯가지가 있습니다.

이 강력한 이름이란, 공유 어셈블리를 배포하기 이전에 부여해줘야하는 것입니다.

즉, 공유 어셈블리는 '강력한 이름'이라는 것을 가져야된다는 것입니다.

 

강력한 이름에는 다섯가지의 종류가 있습니다.

바로, '어셈블리 이름', '버전 값', '공개 키 값', 'Culture 정보', '디지털 서명' 입니다.

이들을 한꺼번에 일컬어 '강력한 이름'이라고 한다 이겁니다.

 

강력한... 좋군요 강력 푸하하... 저만 좋습니다.. 허허

 

왜 그런데 이런걸 만들었을까요?

 

첫번째 목적으로, '어셈블리를 구분하기 위해서'만든 것입니다.

다섯가지의 강력한 이름 중에 하나라도 다르게 되면

해당 어셈블리들은 다른 어셈블리가 되는 것이지요.

 

그리고 두번째 목적으로,

해당 어셈블리가 '수정되었는지'에 대한 유무를 판단할 수 있습니다.

즉, 자신 이외에 다른 사람들은 수정하지 못하도록 만드는

'보안성'이 들어가있다 이겁니다.

따라서, 다섯가지의 강력한 이름에 디지털 서명이 포함되어있고

디지털 서명을 하는 것입니다.

 

예전 이런 기능을 제공하기 이전에는

어셈블리 디스 어셈블링을 통해 내부적으로 코드를 수정할 수 있었습니다.

이 말인 즉, 이러한 행위는 바이러스 생성의 시발점이 되었다 이겁니다.

이러한 문제를 어셈블리 '.snk' 파일과 함께 코드를 기반으로 만들어 놓은 서명을 통해 

어셈블리 수정을 못하게 한것이지요.

 

따라서 내부적으로 이러한 사실에 대해 모르게 되면

해당 어셈블리를 통해 새로운 어셈블리를 만들지 못하게 됩니다.

비록 소스코드를 가지고 있고,

내부에 구조를 빠삭하게 다 알아도 말입니다...

 

정리하자면, 강력한 이름을 가져야하고

이 강력한 이름을 만든 이유는 두 가지입니다.

하나는 어셈블리를 구분하는 것이고,

또 하나는 보안을 위한 것이지요.

 

그런데 위에서도 언급했지만, snk?, 공개키? 비밀키? 뭔말일까요??

 

공개키는 아무에게나 줄 수 있는 키로, 값입니다.

비밀키는 아무에게나 주지 않지요.

이 두 개를 snk에서 가지고 있고, 공개키는 어셈블리에 기록이 되는 것입니다.

 



어셈블리에는 매니패스트가 있습니다.

여기에 공개 키가 포함되어있습니다.

그리고 이 공개키를 통해 해시코드를 만듭니다.

공개키가 길기 때문에... 해시코드를 만들어 사용하는 것이라고 생각하셔도 됩니다.

즉, 어셈블리를 구분하기 위한 코드 값이라고 보면 됩니다.

이를 '공개키 토큰'이라고도 부르지요. 즉, 공개키가 없으면 만들지 못하는 것입니다.

 

따라서, 어셈블리 해시코드는 정보의 축약값이라고 불러도 무방합니다.

또한, 정말로 Uniqe한 것은 아니지만, 같은 확률은 거의 없지요.

 

snk 파일은 '보안'을 뜻하는 것입니다.

마지막에 배포되는 순간 필요하게 되는 것입니다.

 

snk 파일은 잘 보관되어야합니다.

비밀키는 우리눈에 보이지 않지만, 이 비밀키를 더해서 디지털 서명을 만듭니다.

그리고 다시 어셈블리에 기록하게 되지요.

이 서명이란 '내가 만들어 놓은 어셈블리가 확실하다는' 서명을 뜻합니다.

 

참고로, 해당 비밀키는 사용자가 가지고 있는 비밀키라는 뜻입니다.

 

어셈블리에 다 포함이 되어있는데 비밀 키는 포함이 되어있지 않습니다.

따라서, 비밀키를 가지고 있어야 어셈블리를 수정할 수 있게 되는 것입니다.

예를 들어,

해당 어셈블리를 디버깅해서 수정하는 것 또한

비밀키를 가진 사용자만이 가능하다는 소리입니다.

 

정리하자면, 공개 키, 비밀 키 기반의 알고리즘으로 키 값을 만들어

위의 두 가지 측면에서 사용한다 이겁니다.

또한, snk 파일에 공개키 + 비밀키가 들어있는데

매니패스트에 공개키를 보관합니다.

그리고 공개 키를 매니패스트에 기록을 하고 길기 때문에

구분을 위한 공개키 토큰을 만듭니다.

 

snk 파일에 공개키와 비밀 키가 모두 들어가있는 것이고,

dll 파일과 같은 어셈블리에 공개키만이 기록되는 것임을 기억하시길 바랍니다.



매니패스트를 열어서 확인할 수 있는 부분입니다.

이를 통해 공유 어셈블리이며 해당 어셈블리에는 공개키와 비밀키가 들어가있다는 것을 확인할 수 있지요.


이처럼 snk를 가지고 파일을 만들게 되면 '공유 어셈블리'가 되는 것입니다.





재미있는 것은 위의 그림을 보시면 아시겠지만,

'공개 키 토큰'이 있습니다.

이는 다시 말씀드리지만, 공개 키를 압축해놓은 토큰이지요.

이는 똑같은 어셈블리일지라도, 사용자마다 다릅니다.

어셈블리를 가져다 사용할 때 공캐키를 가져다가 사용했는데,

서명이 다르기 때문에 절대 같지 않지요...

우리가 만약, upgrade를 한다면 이 공개키 번호를 확인해야합니다.

 

아무튼... 우리가 만든 공유 어셈블리는

만약, 4.0 이하 버전에서 만들어졌다면 해당 위치에 드래그해서

간단하게 설치하면 됩니다.

 

공유 어셈블리를 사용하게 되면,

.dll 파일이 없어도 실행이 되는 것을 확인하실 수 있습니다.

즉, 공유 어셈블리는 전용 어셈블리와 다르게

다른 프로그램도 해당 어셈블리를 사용할 수 있게 해줍니다. 


공유 어셈블리를 배포나 설치를 하게되면 따로 저장하는 곳이 있습니다.

이전에도 언급드렸지만 바로 GAC이지요.

 

닷넷 프레임워크 4.0 이후부터는 GAC이 달라져서 다른 곳에 들어갑니다...

보안상 해당 디렉터리만을 사용하는 방지하고,

기존에 내용물들도 많기에 위치를 바꾼 것이지요.


또한, .Net Framework 4.0 이후의 버전에서는 보안상 

드래그를 통한 설치가 불가합니다.

따라서 유틸리티로 설치를 해줘야하는데

닷넷에서는 gacutil이라는 프로그램을 통해 설치를 해야합니다.



닷넷을 설치하면 'Microsoft SDKs'에 잘 찾아보면 있을 것입니다.


만약, gacutil 프로그램이 실행이 되지 않는다면

우선 path 설정을 해주고 설치해주시면 됩니다.

어디서든 실행이 가능하도록 

즉, 활성화를 위해서 해당 프로그램이 있는 주소를 path로 설정해주는 것입니다.

경로 설정은 기본적인 것이니 넘어가겠습니다.


 

그리고 이처럼 사용해서 라이브러리를 GAC에 설치해주면 됩니다.


그런데, assembly 폴더에 들어가보면 여러개의 디렉터리로 나뉘어있습니다.

GAC은 여러개의 디렉터리로 나눠져 있다는 것입니다.

따라서 버전 업을 해서 어셈블리를 추가하더라도,

물리적으로 파일이 같은 위치에 저장되는 것이 아니라는 소리입니다. 다른 폴더에 둔다 이거지요.


아무튼.. Windows 입잡에서는

공유 어셈블리를 뒤지라고 하면 이런 위치에서 뒤지게 됩니다.



 

이번 시간은 여기까지 하도록 하겠습니다.

 

이상 삽잡이였습니다!