Microsoft MVP성태의 닷넷 이야기
성태의 사이트 로그인 보안 구현: SysnetLogin [링크 복사], [링크+제목 복사]
조회: 5343
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

성태의 로그인 보안 구현: SysnetLogin
제목 로그인 보안 구현
라이서스 Free
구현예 SYS.NET 로그인.
용어 약속 아래에서 "해커"에 대한 용어에 대해서 잠시 양해를 바랍니다. 원래 "해커"는 나쁜 의미의 용어가 아니었습니다. "크래커"야말로 불법적인 행위를 하는 사람을 일컫기는 하지만. 아래에서는 "크래커"라는 의미로 "해커"를 쓰도록 하겠습니다. 일반인의 인식이 그렇게 많이 변했기 때문에.

또한, 사용자 계정과 "암호" 중에서, 용어의 혼동을 막기 위해서 "사용자 암호"는 "비밀번호"라고 부릅니다. 반드시 "번호"로 구성되어 있지는 않지만, "암호"라는 말이 자주 나오므로 "비밀번호"라는 용어로 대체합니다.
구현 배경 우리는 하루에도 수십 번씩 "HTTP://"를 통해서 웹서비스를 이용합니다. 하지만, 그 어떠한 웹사이트도 "사용자 로긴 정보"가 LAN 선을 통해서 흘러갈 때 완벽한 "평문"으로 흘러간다는 것을 알려주는 곳도 없고, 사용자 역시 어쩔 수 없이 사용하는 것이 현실입니다. Microsoft의 Passport 서비스나 "https://"로 구현되는 SSL 등이 있지만 유료화로 인해 많이 퍼지지 않고 있는 실정입니다.

문제는, 그렇게 흘러가는 사용자 ID와 암호가 그다지 어렵지 않게 네트워크상에서 가로챌 수 있다는 것입니다.

결론은... 웹사이트 스스로 구현을 해야 하는 수밖에 없는데요. 하지만 그것도 그리 쉽지 않습니다. 어쨌든 ActiveX 컨트롤을 내려보내야 하고, 그것을 폼(!)나게 설치하려면 "컨트롤 인증서"를 구입해야 하기 때문입니다.

http://sysnet.pe.kr 웹사이트는 사용자의 로긴정보를 보호하기 위한 예시로서 구현해 보았습니다.
물론, 이 구현이 완벽한 것은 아닙니다. 하지만, 굳이 비유를 들자면... 밭에 끈으로나마 울타리를 치는 것과 치지 않는 것은 엄청난 차이가 있으니까요.
목표 1. 사용자가 입력한 비밀번호를 HTTP 통신을 가로채더라도 알 수 없도록 함.
2. 로긴 데이터를 중간에 가로채더라도 그 데이터로는 더 이상 로긴을 할 수 없도록 함.
절차

SYSNET.PE.KR에서는 다음과 같이 로긴 정보에 대한 보안을 적용하고 있습니다.

1. 회원 가입

-- 클라이언트 측


  ㄱ. 입력한 자신의 ID와 비밀번호를 Seed로 해서 개인키와 공용키를 생성.
  ㄴ. 사용자가 입력한 비밀번호를 MD5 단방향 해시 문자열로 만듦.
  ㄷ.  SYSNET.PE.KR에서 공개한 RSA 공용키로 해시된 비밀번호를 암호화 시킴.
  ㄹ. 평문의 사용자 ID, 사용자의 평문 공용키,
 암호화된 MD5 해시된 비밀번호를 서버로 전송

--- 서버 측
  ㄱ. 전송되어진 평문의 사용자를 DB에 저장.
  ㄴ. 전송되어진 평문의 공용키를 DB에 저장.
  ㄷ. 전송되어진 암호를 서버만이 가진 개인키로 복호화해서 얻은 MD5 해시된 비밀번호를 DB에 저장.



** 효과 **
  1) 해시된 비밀번호가 서버의 DB에 저장되므로 서버 관리자조차도 사용자의 비밀번호를 알 수 없음. 나아가서 DB가 해킹당해도 사용자의 비밀번호를 알 수 없음. 

  2) 만약, DB를 해킹 당한 경우에는, 해킹된 MD5 문자열을 가지고, 고성능 컴퓨터로 모든 문자열에 대해서 차례로 MD5 해시 알고리즘을 적용하여 일치하는 문자열을 찾을 때까지 반복하는 경우에는 확률적으로 원래의 비밀번호를 찾는 것이 가능.

  3) 해커가 네트워크 상에서 데이터를 가로채더라도 MD5 해시된 비밀번호 문자열이 서버 측 RSA 공개키로 암호화되어 있으므로, 해커는 RSA 개인키를 알아내야 하고 MD5 해시 문자열도 해독해야 하므로 확률은 보다 더 낮아지게 됨. 


2. 사용자 로그인

-- 클라이언트 측.
  ㄱ. 입력한 자신의 ID와 비밀번호를 Seed로 해서 개인키와 공용키를 생성.
  ㄴ. 사용자가 입력한 비밀번호를 MD5 단방향 해시 문자열로 만듦.
  ㄷ. 서버에 자신의 공용키와 아이디를 전송.
  ㄹ. 서버는 유일한 "GUID 난수"를 생성하고, "ㄷ" 단계에서 전송되어진 클라이언트의 공용키로 암호화하여 클라이언트로 반환, 또한 해당 "GUID 난수"는 서버의 DB에 해당 ID 회원 정보 테이블에 저장.
  ㄹ. "암호화된 난수 키"를 자신의 개인키로 풀어내고, 해독된 키를 Seed로 해서 RSA 개인키/공용키를 만듭니다.
  ㅁ.  "난수 키"로 만들어진 공용키로 MD5 해시된 사용자 암호를 RSA 암호화 하여 서버로 전송, 평문의 사용자 ID 전송.

-- 서버측
  ㄱ. 전송되어져 온 평문의 사용자 ID에 해당하는 "GUID 난수"를 서버의 DB로부터 조회.
  ㄴ. "GUID 난수"로 RSA 개인키/공용키를 생성.
  ㄷ. 전송되어져 온 암호화된 MD5 해시 비밀번호를 "GUID 난수"로 생성된 개인키로 RSA 복호화.
  ㄹ. 복호화된 MD5 비밀번호와 사용자 ID 정보가 서버에 있는지 조회.
  ㅁ. 있으면 정상 로긴 절차를 거치고, 저장된 서버의 "GUID 난수"를 제거.


** 효과 **
  1) 오고가는 패킷을 가로채어 마지막으로 서버로 전송되어지는 정보를 가로챈다해도 해커는 두 번 다시 그 문자열 구성으로 "재로긴"을 시도할 수 없음. 즉, 현재의 모든 웹사이트에서는 HTTP FORM이 Submit 된 시점의 데이터가 네트워크를 흘러가는 것을 가로채게 되면, 해커는 동일한 HTML FORM 구성을 통해서 간단히 재로긴을 할 수 있지만, "SYSNET" 웹사이트에서는 그것이 불가능.
 

3. 회원 정보 변경(비밀번호 변경)

-- 클라이언트 측, 서버 측 모두 "2번 사용자 로그인"과 동일한 절차로 정보 전송.
결론 물론. 암호화해야 할 것이 ID/PW만은 아닐 것입니다. 웹사이트를 이용하다 보면, 민감할 수 있는 자료들이 있을 텐데. 그것에 대해 일일이 암호화를 제공하기는 힘들지도 모르겠습니다. 차라리 그런 경우에는 SSL을 이용하는 것이 좋겠지요.

제 웹사이트는 예를 제시할 뿐이지만. 다른 웹 사이트들도 나름대로의 보안 장치를 마련하게 되기를 바랍니다. ^^; HTTP뿐만 아니라. 메일까지도 암호화 적용이 확산되기를 바라며.
 
그 외 알림 사항 정확한 소스는 제공해 드리지 않지만, 로그인에 해당하는 ASPX 파일의 스크립트를 보시면 될 것 같습니다. 즉, 클라이언트 측 소스는 모두 공개된 것이나 다름없습니다. 나머지 서버 측의 코드는 클라이언트의 동작과 맞추어서 그다지 어렵지 않게 구현하실 수 있을 듯합니다.

그리고, 여러분의 의견을 기다립니다. 위의 구현 방법에서 좀 더 효율을 높일 수 있다거나 개선 사항, 버그, 해킹 예상 경로를
 발견하시게 되면. 알려주시면 정말 감사하겠습니다.







[최초 등록일: ]
[최종 수정일: 7/9/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




[1]  2 
NoWriterDateCnt.TitleFile(s)
37정성태6/7/2016729MSBuild Structured Log: record and visualize your builds
36정성태10/20/20062998SmallTool ver 1.0.1.2 - 변경된 점
34정성태7/27/20062388SmallTool ver 1.0.1.1 - 변경된 점
35정성태7/27/20062297    답변글 SourceGDN].0.060717.001 - 변경된 소스파일 다운로드1
33정성태7/24/20062377SmallTool ver 1.0.1.0 - 변경된 점.
32정성태6/30/20062400사용 사례 : 7. 스키마 상속 처리 (3)
30정성태6/27/20063148사용 사례 : 6. 스미카 상속 처리 (2)
29정성태6/27/20062183사용 사례 : 5. ConsoleBat.exe - Path가 설정되어 있는 Command 창 이용하기
28정성태6/27/20062612사용 사례 : 4. 스미카 상속 처리 (1)파일 다운로드1
27정성태6/27/20062481사용 사례 : 3. XSDObjectGen - partial class 생성파일 다운로드1
26정성태6/29/20062325사용 사례 : 2. XSDObjectGen - Enum 처리에 대한 기능 향상파일 다운로드1
31정성태6/29/20062467    답변글 사용 사례 : 2.1 XSDObjectGen - Enum 처리 방식 변경
25정성태6/23/20062847사용 사례 : 1. VS.NET 통합 환경에서 XSDObjectGen 실행
24정성태6/23/20062344자동 로그인 ver 1.53파일 다운로드1
22정성태6/18/20062431ST : XSDObjectGen 1.4.2.1 포함
23정성태6/18/20062414    답변글 XSDObjectGen 1.4.2.1 - 커스터마이징파일 다운로드1
20정성태1/4/20073572ST: NDoc 2.0 한글 지원 버전
21정성태5/26/20062822    답변글 [답변]: ST: NDoc 2.0 한글 지원 버전 (업데이트)
19정성태5/18/20064123ST: ROBOCOPY.exe
18정성태4/20/20062562자동 로그인 ver 1.52 [2]파일 다운로드1
11정성태2/14/20047146폴더 백업( 동기화 ) 프로그램 [5]파일 다운로드1
7정성태7/24/20033041IExtender : Internet Explorer 확장툴 [2]
8정성태8/4/20032447    답변글 제거방법
6정성태7/23/20035343성태의 사이트 로그인 보안 구현: SysnetLogin
5정성태12/24/20043493성태의 게시판 구현이론: SysnetBoard
[1]  2