Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Nonamed Develog

[TIL][240705] hashlib, logging, sleep() 본문

WHAT I LEARN/TIL

[TIL][240705] hashlib, logging, sleep()

노네임드개발자 2024. 7. 5. 21:18
어떤 문제가 있었나?

class를 활용하여 회원가입과 포스트 작성을 구현하는 팀 과제에서 내가 맡은 부분은 입력받은 비밀번호를 파이썬 라이브러리 hashlib을 사용하여 암호화한 후 비밀번호가 암호화되었다고 로그를 남기는 것이었다. 비밀번호를 암호화하는 작업은 어렵지 않았다.

 

문제는 비밀번호가 암호화됐다는 알림을 파이썬 라이브러리 logging을 이용하여 출력하는 부분에서 생겼다. Member class와 Post class input 입력 사이에 로그 메시지 출력을 원했으나 두 개의 input 사이에 중첩되는 현상이 생겼다.

이름을 입력하세요: name
ID를 입력하세요: id
비밀번호를 입력하세요: 123
╒════════╤══════╕
07/05/2024 06:15:44 PM :INFO: The password has been hashed
│ Name   │ ID   │
╞════════╪══════╡
│ name   │ id   │
╘════════╧══════╛
제목을 입력하세요:
이름을 입력하세요: name
ID를 입력하세요: id
비밀번호를 입력하세요: 123
╒════════╤══════╕
│ Name   │ ID   │
╞════════╪══════╡
│ name   │ id   │
╘════════╧══════╛
제목을 입력하세요: 07/05/2024 06:15:44 PM :INFO: The password has been hashed

위와 같이 로그 메시지가 첫번째 input 출력 사이에 존재하거나 두번째 input을 넘어가는 현상이 일어났다. 코드는 분명 작성 순서대로 실행되는데 이유가 무엇일까?


무엇을 시도했나?

첫번째로 구글링을 했다. 비슷한 경우를 한글 검색과 영어 검색 모두 찾을 수가 없었다. logging 관련 글을 찾아봐도 로그 메세지가 중첩되는 경우는 없었다. logging에 대해서 공부를 해보니 logging이라는 라이브러리는 시각적으로 알림을 주려는 우리 팀의 목적과는 달리 컴퓨터에서 얻은 로그를 출력, 저장, 전송하기 위해 존재한다고 한다.

 

아무튼 출력의 모양을 바꿔보기 위해서 logging.info() 코드 앞 뒤로 개행을 시도해보고 코드의 위치를 변경해봤지만 중첩되는 범위만 넓어질 뿐 해결이 되지 않았다.

이름을 입력하세요: name
ID를 입력하세요: id
비밀번호를 입력하세요: 123
╒════════╤══════╕

07/05/2024 06:15:44 PM :INFO: The password has been hashed

│ Name   │ ID   │
╞════════╪══════╡
│ name   │ id   │
╘════════╧══════╛
제목을 입력하세요:

...

저 로그를 꼭 input 사이에 위치 시키리라! chatGPT를 켰다. 그가 알려준 해결 방안 중 handler를 이용해보기로 하고 해당 내용을 찾아봤지만 역시나 이 문제를 해결할 방법은 아니었다. 나는 마지막 찬스를 앞두고 있었다.


어떻게 해결됐는가?

나의 마지막 찬스는 튜터님이었다. python 가상환경 특강과 팀 미팅으로 시간이 지체되었는데, 갑자기 내 분노의 텔레파시 때문일까? 튜터님이 우리 조를 방문하셨다. 항상 그렇듯 튜터님은 힌트를 던지고 가셨다. 암암 물고기를 잡아주기보단 잡는 법을 알려줘야지. 튜터님의 힌트는 "sleep을 써보세요 ;-)" 이 한 문장으로 그 간의 고민은 사라졌다.

 

바로 구글링을 해본 결과, sleep()이라는 함수는 일시정지를 의미했다. 오호라 로그 메시지가 계속 왔다갔다 했던 이유는 메시지 생성 속도랑 관련이 있었고, sleep()을 이용하여 logging.info() 메시지 시간을 조절하면 원하던 출력이 나오겠다는 생각이 들었다.

import time

time.sleep(0.3)  # 0.3초 간 정지
logging.info("The password has been hashed")  # 로그 메세지
time.sleep(0.3)  # 0.3초 간 정지

처음엔 넉넉하게 2초를 넣어봤지만 너무 느리게 느껴져서 1초, 0.5초 0.3초까지 내려서 sleep()을 안쓴 것 처럼 출력되게 0.3초로 설정했다. 아래는 실행 결과이다.

이름을 입력하세요: name
ID를 입력하세요: id
비밀번호를 입력하세요: 123
╒════════╤══════╕
│ Name   │ ID   │
╞════════╪══════╡
│ name   │ id   │
╘════════╧══════╛
07/05/2024 06:15:44 PM :INFO: The password has been hashed
제목을 입력하세요:

새로 알게 된 점은 무엇인가?

logging을 사용하여 로그 남기기

먼저 로그를 남기기 위해서는 logging 라이브러리를 사용해야 한다. 로그에는 중요도에 따라 5가지 레벨이 존재한다. 파이썬의 기본 logging 시스템 레벨은 warning으로 설정되어 있다. 따라서 설정을 따로 하지 않으면 warning 레발과 이보다 심각한 레벨의 로그만 처리된다.

  • debug: (주로 문제 해결을 할 때 필요한) 정보
  • info: 작업이 정상적으로 작동하고 있다는 확인 메시지
  • warning: 예상하지 못한 일이 발생하거나 발생 가능한 문제점을 명시 
  • error: 프로그램이 함수를 실행하지 못 할 정도의 심각한 문제
  • critical: 프로그램이 동작할 수 없을 정도의 심각한 문제 

로그를 생성하여 출력하는 방법

import logging

logging.basicConfig(
    format='%(asctime)s :%(levelname)s: %(message)s',  # fomat- 시간:레벨:로그메시지 출력
    datefmt='%m/%d/%Y %I:%M:%S %p',  # 시간 포멧을 따로 정해준다
    level=logging.INFO,  # 로그 레벨을 정해준다
)

logging.info("The password has been hashed")  #  출력 코드

 

hashlib으로 입력값 암호화 하기

문자열을 해싱하려면 hashlib 라이브러리를 이용해야한다. 해싱 방법에는 대표적으로 SHA265가 있다. 오늘 입력 받은 비밀번호를 해싱하는데 작성한 코드는 다음과 같다.

import hashlib

password = input("비밀번호를 입력하세요: ")
m = hashlib.sha256()  # m hashlib.sha256()으로 m이라는 객체를 생성
m.update(password.encode("utf-8"))  # .encode("utf-8"))을 이용하여 UTF-8 형식으로 변환
hash_password = m.hexdigest()  # hexgigest()는 바이트 문자열을 16진수로 변환

 

sleep() 함수로 일시정지 하기

위에 설명한대로 sleep()은 출력을 일정시간 정지하는 코드이다.  sleep() 함수를 사용하기 위해선 time 라이브러리를 사용해줘야 한다. sleep() 괄호 안에는 초 단위 시간을 넣어 일시 정지 할 수 있다.


무엇을 느꼈고 내일은 무엇을 할까?

여러 라이브러리를 이용하였는데 아직 최종 코드에 적용해보지 못했으므로 최종 코드를 pull한 이 후에 적용을 해볼 예정이다.