정글에 들어온 후 처음으로 쓰는 공부 기록 포스팅
포스팅에 들어가기 전에 간단히 소감을 말하자면 너무 설렌다.
0주차가 끝난 지금 시점에 점점 내 스스로 공부하는 법을 배우고,
능동적으로 공부하면서 재미를 느끼고 있다는 것이 나에게 더 활력을 준다.
앞으로도 이 감정을 쭉 간직할 수 있기를!
0주차 주제 - 뭐든지 '돌아가는 웹 서비스' 를 만드세요.
0주차 발제 내용이 단기 미니 프로젝트라는 걸 알고 있었다.
하지만 현실을 부정하며 대비하지 않은 나에게 역시 폭풍처럼 몰려오는 공부량..
처음 조가 배정된 후 서로 다른 곳에서 서로 다른 공부를 해온 사람들과 팀이 되어 3일만에 웹 서비스를 만드는 것은 절대 쉬운 일이 아니었다.
게다가 우리 조원 모두 적극적이고 의견도 확고해서 의견 취합하는데에도 에너지를 조금 쏟았다고 생각한다.
내가 진짜 주장이 강한 편이라 괜히 우리팀 조금 힘들었을지도,,(몰래 여기서 죄송합니다.)
아무튼 우리는 마우스 드래그 박스가 얼마나 정확한 정사각형인지 점수를 매겨 랭킹을 보여주는 게임을 만들었다.
나는 JWT 회원 인증 토큰을 담당했다. 로그인을 인증하고 권한을 부여/만료 시키는 로직이었다.
개발을 하면서 매번 느끼는 거지만,
현업자들이 쓸 수 있게 쉽게 만들어 놓은 모듈들을 내가 공부해서 사용하려면 너무 어려워서
항상 골머리를 썩히는데 이번에도 마찬가지였다.
Flask 서버로 돌리는 파이썬 JWT는 두가지 종류가 있는데 (이것도 다르다는걸 나중에 알게됨)
PyJWT / Flask-jwt-extended 이 두가지이다.
아예 pip로 설치하는 모듈도 별개인 만큼 사용법이 다 다른데 두개를 같이 설치하면 호환성 문제가 발생한다.
난 그래서 처음엔 Flask-jwt-extended로 공부하고 쓰다가, 영문을 모르는 에러가 한 코드씩 계속 발생해서
PyJWT를 사용했다.
실제로 관련 레퍼런스를 찾아보면 PyJWT는 오류 문제가 적고, Flask-jwt-extended는 많은지 모르겠지만
실제 다운로드 수는 PyJWT가 더 많은데 extended 토큰이 구글링 시 질문 답변의 자료들이 더 많았다.
코드를 짠 로직을 설명하자면,
1. 로그인 버튼이 눌리면 POST로 서버에 요청
2. 서버가 요청되면 로그인 로직을 통해 회원인지 판별 후 인코딩한 토큰을 발급
3. 클라이언트에서 쿠키를 생성 한 뒤 게임 페이지로 이동
3++
쿠키를 확인하는 로직을 조금 신경써서 짰기에 조금 자세히 설명하면, 일단 데코레이터를 선언해서 쿠키가 있는지 확인했다.
request.cookies.get('mytoken') 을 사용해서 내가 발급한 토큰의 이름인 mytoken이 쿠키에 들어있는지 확인하는 것이다.
Flow1 . 만약 없다면 홈페이지인 로그인페이지로 이동시킨다.
Flow2 . 있다면 홈페이지로 이동되는 요청을 받더라도 게임페이지로 이동시킨다.(로그인된 사용자는 게임페이지가 홈페이지인 셈)
데코레이터를 사용한 이유는 다양한 함수에서 토큰이 있는지 확인해야 했기 때문에 불필요한 중복 코드를 줄이기 위함이다.
++추가적으로 데코레이터 첫번째 if문은 만약 사용자가 임의로 라우팅을 수정하여 다른 계정으로의 접근이 허용된다는 점을 방지하기 위해 코드를 추가했다.
def requires_jwt(func):
@wraps(func)
def decorated_function(*args, **kwargs):
token_receive = request.cookies.get('mytoken')
if token_receive is None:
print("쿠키가 없습니다.")
return redirect("/")
try:
payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
if payload['id'] != kwargs['user_id'] :
return redirect("/")
# 여기서 필요한 추가적인 유저 정보를 전달할 수 있습니다
request.current_user = payload
except jwt.ExpiredSignatureError:
print("쿠키가 만료되었습니다.")
return redirect("/")
except jwt.exceptions.DecodeError:
print("쿠키 디코딩에 실패하였습니다.")
return redirect("/")
return func(*args, **kwargs)
return decorated_function
또한 우리 팀은 Serverside Rendering(SSR) 방식을 사용했고, 클라이언트에 서버에서 요청받은 함수에 대한 정보를 넘겨줘야 할 때,
위의 데코레이터를 사용한 후 유저의 정보를 쉽게 넘겨 줄 수 있도록 했다.
이건 별거 아니지만 PyJWT와 환경변수 보호를 위해 사용했던 dotenv를 사용할 때 발생했던 에러들을 정리해 둔 노션
++ PyJWT와 JWT-extended 는 서로 다른 JWT 모듈인데 건들이는 시스템이 비슷한 것인지 둘 다 설치되어 있으면 가끔 에러가 발생한다고 하니 둘 중에 하나를 선택해서 삭제하는 것도 방법이 될 수 있을 것 같다.
아무튼 그렇게 3일 천하 토이 프로젝트는 마무리 되었다.
(jeongminjo.shop -> 내가 만들었지만 재밌음)
0주차를 마치고 느낀 것들
개발자가 되기 위해 치열하게 살아온 사람들
인생을 개발에 담은 사람들을 많이 만나고 느낀 것은
내 지금 위치로 여유부리면 안된다는 것이다.
나보다 세 봉우리는 앞서있는 사람들이 나보다 치열하게 등반을 하고 있다.
매 순간 한 웅큼이라도 더 이해하기 위해 노력할 것이다.
7주차에는 정말 어려운 OS를 배운다고 들었다.
그때의 나는 해당 주차를 충분히 소화할 역량을 가지고 성장해 있는 내가 되어 있을 것이다.
그리고 짧은 시간이었지만 정말 열심히 하면 된다는 것을 조금이나마 느낄 수 있었던 프로젝트여서
매우 뿌듯했고, 더 부족한 점 ( 발표 능력, 역량 평가, 끈기) 은 앞으로 더 보완 할 수 있도록 노력하겠다.
'Jungle' 카테고리의 다른 글
[TIL][Krafton Jungle] 1주차 - (4) : 알고리즘 공부 (4) | 2023.10.18 |
---|---|
[TIL][Krafton Jungle] 1주차 - (3) : 알고리즘 공부 (1) | 2023.10.17 |
[TIL][Krafton Jungle] 1주차 - (2) : 컴퓨터 시스템 (2) | 2023.10.15 |
[TIL][Krafton Jungle] 1주차 - (1) : 알고리즘의 희노애락에 입성 (0) | 2023.10.15 |
찬찬히 나를 돌아보는 시간 (0) | 2023.10.14 |