항해99 1주 차 WIL
![]()
1주 차 항해를 마치며
항해 99에 참가하고 많은 새로운 경험을 하고 있다.
살면서 하루에 게임을 제외하고, 매일 이 정도 시간을 투자한 적이 있던가?
어떤 공부를 하더라도 이 정도 시간을 몰입, 투자한 적은 없었다.
이러한 부분에서 나도 하면 할 수 있는 사람이라는 것을 느끼게 된 것이
1주 차의 가장 큰 성과로 보인다.
자기주도학습에 대해서
항해 99에서 가장 중요하게 생각하는 부분이라고 생각된다.
주입식으로 강의를 듣는 것에 익숙한 본인으로서는 1주 차 시작 전
다소 걱정되는 부분이기도 했다.
하지만 스스로 공부하고, 부족한 부분을 강의 후 추가적으로 실습해 보며
정말 오래간만에 깨달음 하는 기쁨을 느꼈다.
웹캠을 키고 활동하는 것에 대해서도 거부감이 있었으나 화상이긴 해도
같은 시간, 같은 공간에서 같은 것을 공부하는 사람들이 있다는 것만으로도
공부하는데 큰 도움이 되었다.
또한, 모르는 부분을 질문하고, 질문을 답변해 주는 과정에서
스스로 개념을 정립할 수 있었고,
힘든 시간 서로가 서로에게 힘이 되어주는 좋은 경험을 했다.
토, 일 미니 프로젝트
해당 일정에서는 스스로 얼마나 부족한지를 자각하는 계기가 되었다.
처음 하는 협업으로 많이 버벅였고, 특히 개발자가 되려면 필수로 다뤄야 할
깃 허브를 통한 프로젝트 상황 공유에 큰 어려움을 겪었다.
초기에는 깃이 제일 어렵다는 것이 피부로 와닿았다.
아이디어 회의 > 와이어 프레임 작성 > api, db 설계 >
파트 분배 > 작업 > push, pull > merge > 배포까지
모든 일련의 과정을 진행하면서 초기 설계 및 조율이 얼마나 중요한지도
깨닫게 되는 계기가 되었다.
스스로 구글링 하여 필요한 코드를 찾아보고, 적용해가는 과정과
오류를 직면했을 때 하나씩 해결해 가는 과정 역시
앞으로의 항해에 있어서 큰 도움이 될 것으로 기대된다.
개인적으로는 다소 아쉬운 퀄리티의 프로젝트를 제출했지만 적어도
일정이 진행되는 동안 최선을 다했기에 후회는 없지만,
아무래도 ~이렇게 했으면 어땠을까 하는 아쉬움은 많이 남는다.
더 정진하여, 앞으로의 팀플에서는 아쉬움조차 안남길 수 있도록 해야겠다.
금주의 베스트 코드
당연 python flask jwt를 사용한 회원가입, 로그인 시스템 구현이 되겠다.
토, 일 미니 프로젝트 간 본인을 가장 많이 고뇌하게 만든 코드인데
숨 쉬듯이 하는 회원가입과 로그인이기에 가볍게 생각했으나
실상은 그렇지 않았다.
미니 프로젝트 상에서는 개인정보를 요청하지 않았지만,
대부분의 사이트는 개인정보를 요청하고 그것을 통해 본인인증을 진행한다.
입력된 개인정보의 유출은 해당 웹, 앱에 대한 신뢰도 하락과 직관되기에,
암호화 개념이 적용돼야 한다는 것을 뒤늦게 깨달았다.
import hashlib
hashlib은 파이썬 라이브러리가 제공해 주는 hash 함수이라고 한다
해당 기능을 사용하여 어떤 방식으로 문자열을 암호화 시킬지 설정하면
이용자로부터 받은 input 값을 암호화할 수 있다.
암호화 방식에는 md5, sha256 등이 있는데
미니 프로젝트에서는 sha256 방식을 선택했다.
사실 현재 두 방식이 뭐가 다른지는 모른다.
앞으로 해당 기능에 대한 더 많은 공부가 필요하다.
@app.route("/sign", methods=["POST"])
def sign_post():
user_name = request.form['name_give']
user_pwd = request.form['pwd_give']
user_pwd_re = request.form['pwd_re_give']
if (user_pwd_re == user_pwd):
password_hash = hashlib.sha256(user_pwd.encode('utf-8')).hexdigest()
doc = {
"username": user_name, # 아이디
"password": password_hash, # 비밀번호
}
db.info.insert_one(doc) # 유저가 입력한 아이디, pw DB에 저장
return jsonify({'result': 'success'})
else:
return jsonify({'result': 'fail','msg': '비밀번호가 일치하지 않습니다.'})
회원가입 창에서 받은 유저의 input 값을 저장하는 과정 중
password_hash =
hashlib.sha256(user_pwd.encode(‘utf-8’)).hexdigest()
hash 함수를 사용하여, 입력된 값을 암호화한다.
그리고 설정한 조건을 통해 DataBase에 저장할지 말지를 정한다.
login_post():
login_name = request.form['username_give']
login_pwd = request.form['password_give']
pw_hash = hashlib.sha256(login_pwd.encode('utf-8')).hexdigest() # 유저가 입력한 pw를 해쉬화
result = db.info.find_one({'username': login_name, 'password': pw_hash})
# 아이디와 유저가 입력한 해쉬화된 pw가 DB에 저장되어 있는 해쉬화된 pw와 일치하는지 확인
if result is not None: # 일치한다면
payload = {
'id': login_name,
'exp': datetime.utcnow() + timedelta(seconds=60 * 60 * 1) # 로그인 1시간 유지 -> 해커 취약점 방지 로그인 시간 조정
}
# 유저 아이디와 유효기간을 담고 있는 payload 생성
token = jwt.encode(payload, app.SECRET_KEY, algorithm='HS256') # jwt기반 토큰 생성
return jsonify({'response': 'success', 'mytoken': token})
else:
return jsonify({'response': 'fail', 'msg': '아이디/비밀번호가 일치하지 않습니다.'})
hash 함수를 사용해 가입한 이용자가 로그인 시 input 받은 값 중 저장 시 암호화 했던 항목을 다시 암호화 하고
if result is not None: # 일치한다면
payload = {
'id': login_name,
'exp': datetime.utcnow() + timedelta(seconds=60 * 60 * 1) # 로그인 1시간 유지 -> 해커 취약점 방지 로그인 시간 조정
}
# 유저 아이디와 유효기간을 담고 있는 payload 생성
입력한 값과 DB에 저장된 값이 일치한다면,
payload를 생성한다 payload에 담을 값은 설정한다.
프로젝트 상에서는 유저 아이디와, 토큰의 유효시간을 담았다.
import datetime
exp 설정을 위해서는 해당 코드를 기입해 줘야 했다.
token = jwt.encode(payload, app.SECRET_KEY, algorithm='HS256') # jwt기반 토큰 생성
return jsonify({'response': 'success', 'mytoken': token})
else:
return jsonify({'response': 'fail', 'msg': '아이디/비밀번호가 일치하지 않습니다.'})
jwt를 사용하여 payload, 시크릿키(정의한 값), 암호화 알고리즘을 넣어
인코딩 해주면 해당 유저만의 토큰이 생성된다.
조건을 만족했을 때, 로그인과 함께 유저에게 토큰을 부여한다.
import jwt
jwt를 사용하기 위해서는 해당 임포트와 pyJWT 인터프리터 설치가 필요했다.
해당 토큰을 브라우저 쿠키에 저장하고,
유저는 이를 기반으로 회원 전용으로 정의된 활동을 할 수 있게 된다.
미니 프로젝트 상에서는 발급한 토큰을 쿠키에 넣고, 쿠키에 토큰을 디코딩 하여,
필요한 값을 다시 추출하는 과정까지 구현하였지만 솔직히 이해했다고 이해했다고 보기는 어렵다.
암호화와 토큰 부여는 이해를 하고 코드를 바로 읽을 수 있으나,
그 후의 과정은 아니므로 좀 더 공부가 필요해 보인다…
회원가입, 로그인 기능은 필수를 넘어선 그냥 당연한 기능이기에
앞으로 해당 기능에 대해서 더 깊이 알아보는 과정이 필요하겠다.
코딩의 길은 멀고 멀지만, 다음 주에 더 나아져 있을 내 모습을 기대해 본다.
댓글남기기