본문 바로가기
[챌린지]/[패스트캠퍼스] 파이썬 초격차

패스트캠퍼스 환급챌린지 36일차 미션 (3월 7일) : 파이썬으로 할 수 있는 모든 것 with 47개 프로젝트 초격차 패키지 수강 후기

by 쿠키토끼 2024. 3. 7.

01. 제목

패스트캠퍼스 환급챌린지 36일차 미션 (3월 7일) : 
파이썬으로 할 수 있는 모든 것 with 47개 프로젝트 초격차 패키지 Online 수강 후기
 

02. 포스팅 본문 (학습 일기) 가이드

 
1. 학습 인증샷 2장 이상 포함

카메라로 직접 촬영한 수강 인증 사진 (캡쳐X)

 

 

2. 학습 후기 700자 이상 (공백 제외)

오늘은 암호화의 정규 표현식으로 개인정보 보호(re)와 비밀번호 감추기 모듈 getpass에 대해서 배웠다.

정규 표현식을 잠깐 배웠는데(사실 기억이 잘 나지 않는다. 복습 다시 해야할 듯) 기억이 안나는 나를 위해 다시 정리하자면, 정규표현식은 복잡한 문자열을 처리할 때 사용하는 기법으로 파이썬뿐 아니라 C, 자바, 심지어 문서 작성 프로그램 등 문자열을 처리해야하는 다양한 상황에서 활용된다(아 쓰고 보니 생각났다!) 파이썬 정규 표현식은 re 라는 표준 라이브러리를 사용한다. 대표적으로 사용하는 예시에는 주민번호 뒷자리가 있다.

개인정보가 포함된 문서에서 주민번호 뒷자리를 별표(*******)로 마스킹하고자 할 때 예를들어

personal_info = '''

전정국 011-5858-5959 jungkook@bighitmusic.co.kr 970901-111111

송강 011-1004-1004 songkang@namooactors.com 940423-123456

다니엘 011-2828-1234  newjeans_danielle@ador.world 050411-876543'''

위의 개인정보(보시다싶이 이건 fake 입니다. 샘플예제로 제맘대로 작성한거니 혹시 검색하다가 발견하시고 개인정보 유출이라 하시면 안됩니다)를 정규 표현식으로 사용하지 않을 경우는 4가지의 형태로 주민번호를 마스킹해야한다.

1. 공백 문자를 기준으로 전체 텍스트를 나눈다(split() 함수 사용)

2. 나눈 단어가 주민등록번호 형식인지 조사한다.

3. 주민등록번호 형식이라고 하면 뒷자리를 *** 별표로 마스킹한다.

4. 나눈 단어를 다시 조립한다.

코드로 나타내어 보자

result = []

for line in personal_info.split("\n")  # 텍스트 나누기 1 - split 함수 사용

    word_result = []

    for word in line.split(" "):   # 텍스트 나누기 2

         if len(word) == 13 and word[:6].isdigit() and word[6:].isdigit():  # 주민번호 형식인지 조사

            word = word[:6] + "-" + "******"   # 뒷자리 마스킹

         word_result.append(word)

    result.append(" ".join(word_result))   # 단어 결합

print("\n".join(result))

이런식으로 만들 수 있는데 그냥 봐도 복잡하다. 일단 텍스트를 줄바꿈으로 나누고 공백으로 나누고 주민번호 형식을 조사하는 if 문을 써서 13자리이면서 앞에 있는 6자리도 숫자형(isdigit)이고 뒤의 6자리도 숫자형이어야 주민번호이다라는 형식을 조사한다. (실제 주민번호랑 오해할 수 있어서 임의로 전체 13자리, 뒷자리 6자리로 바꾸어보았다)

주민번호임이 맞다고 형식 확인이 되면 앞의 :6 자리는 두고 뒤의 하이픈은 표시해주고 뒤의 6자리를 별표로 마스킹한 것을 다시 word 변수에 저장한다. 그리고 append해서 마지막으로 공백을 기준으로 split를 해줬기 때문에 join해서 다시 결합해주도록 한다.

두 번째는 정규 표현식을 사용할 경우로 코드만 봐도 매우 간단하다.

숫자6 + 붙임표(-) + 숫자6 (단, 앞의 숫자6은 괄호를 사용하여 그룹으로 지정) 하는 방식으로 코드를 써준다.

일단 import re 해서 정규표현식 re를 임포트한다. 

pat = re.compile("(\d{6})[-]\d{6}")  # \d는 digit을 뜻하는 숫자형으로 6자리 나오고 중간에 하이픈 하고 뒷자리 6자리 나온다. 괄호()는 그룹으로 지정한다.

print(pat.sub("\g<1>-******, personal_info))   # g<1> : 주민번호 앞부분 그룹 (첫번째 그룹)을 의미

여기까지 정규 표현식으로 개인정보 보호하는 손쉬운(?) 방법이다.

다음은 비밀번호를 감추는 getpass 라이브러리에 대해서 알아보았다.

사용자가 어떤 입력하는 값은 보통 input을 쓰게 되는데 id 값은 상관없지만 password 같은 경우는 인풋을 넣게 되면 비밀번호가 노출되는 문제가 생긴다. 이럴때 getpass 모듈을 쓰면 사용자가 비밀번호를 입력하여도 화면에 바로 노출되지 않도록 해준다.(갑자기 이거 보고 궁금해서 N사와 G사의 비밀번호 그리고 K사의 비밀번호는 어떻게 되어 있을까 궁금했다. 파이썬과 관련없는 자바스크립트는 역시나 매우 간단하게 input을 해주고 type만 text(G사는 아이디가 메일이라 email)인지 password인지 설정해주면 된다 매우 간단하네 의문의 파이썬 1패)

비밀번호 잠금 해제 예제를 알아보자

일단 원본 비밀번호를 만들고 

pw = 'fastcamp02-501-9396!' 

사용자가 비밀번호를 입력해주는 input을 만들어본다.

user_input = input("비밀번호를 입력해주세요 >>> ")

while user_input != pw:

      # 비밀번호 불일치 메세지

      user_input = input("잘못된 비밀번호 입니다! 다시 입력해주세요 >>> ")

print('잠금이 해제되었습니다')

이런식으로 input을 띄우고 사용자가 입력해준 값은 그대로 나오게 되어서 보안에 취약하다.

이 비밀번호를 감추기 위한 로직은

import getpass 모듈을 불러오고

user_input = getpass.getpass("비밀번호를 입력해주세요 >>> ")  # 인풋이 아닌 겟패스 모듈을 적는다!!

while user_input != pw:

      # 비밀번호 불일치 메세지

      user_input = getpass.getpass ("잘못된 비밀번호 입니다! 다시 입력해주세요 >>> ")

print('잠금이 해제되었습니다')

이런식으로 인풋 빼고 getpass.getpass만 바뀌게 되는데 비밀번호가 암호화 되게 된다. 방송통대학교에서 코드 한줄 빼먹어서 개인정보 유출이 어마무시하게 된 사건이 떠오른다. 지원서를 적는 중간에 수동저장을 해주고 이것을 바탕으로 저장된 것을 불러오면 해당 URL이 나타나고 이 URL 코드에서 다른 문자로 변경만 해주면 다른 사람의 정보를 가져오게 된다. URL 변조자체는 막을 수 없고 대신 if문 하나로 막을 수 있었는데 '유저가 URL에 접수번호=123 적어서 보내면' if (지원서요청중유저 == 지원서에기록된유저) { '접수번호=123인 지원서 보내줌' } 으로 이렇게 if 코드 하나만 일치시키는 부분만 해줬어도 암호화 할 수 있는 부분이라니 개발을 할 때 항상 이런 부분을 염두해야할  것이다. 그러나 내 개인정보는 이미 공공재... 단, 위에 샘플은 fake 이니 공공재가 아닙니다 ^^;

 

 

 

03. 필수 본문 내용 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
 

04. 필수 해시태그 

#패스트캠퍼스 #직장인자기계발 #직장인공부 #환급챌린지 #패스트캠퍼스후기 #오공완

05. 필수 URL 

https://bit.ly/48sS29N

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

[수강 강의 클립] 

-Ch06. [암호화] 개인정보는 소중해, 메세지 변조 탐지기 만들기

02. 정규 표현식으로 개인정보 보호 - re

03. 비밀번호 감추기 - getpass 

 

[※ 기타사항메모 ※]
{100% 환급챌린지 미션 가이드 참조 : 

https://fastcampus.co.kr/event_online_challenge_2401_mission}

 

커리어 성장을 위한 최고의 실무교육 아카데미 | 패스트캠퍼스

성인 교육 서비스 기업, 패스트캠퍼스는 개인과 조직의 실질적인 '업(業)'의 성장을 돕고자 모든 종류의 교육 콘텐츠 서비스를 제공하는 대한민국 No. 1 교육 서비스 회사입니다.

fastcampus.co.kr