-
항해99 1주차 WIL카테고리 없음 2022. 5. 15. 23:26
Weekly I Learned
5/9 ~ 5/12 : 미니 프로젝트 진행(4인/팀)
5/13 ~ 5/15 : 알고리즘
미니 프로젝트를 통해 팀원들과의 소통이 얼마나 중요한지 알 수 있었다
비록 짧은 시간이였지만 현업에서 일을 하게 되면 이런 느낌이겠구나! 라는 생각을 하였고, 프로젝트를 기획부터 배포까지 전 사이클을 팀원들과 함께 하며 앞으로의 항해에서 배워야할 것들이 무엇인지 정리하는 시간이었다
핵심 기능
JWT (JSON Web Token) / Token Based Auth
사용자 인증 위해 사용되는 인테넷 표준 인증 방식이다. Web 뿐만아니라 Mobile app등의 client에서도 사용가능하다. 로그인 시 client로부터 request 될 때 가져온 Id와 password가 확인 되면 sever는 사인 알고리즘을 이용해 작성된 사인 정보를 String 형태로 Token에 담아 client에 전달 한다. client의 다음 request부터는 발급 받은 Token을 함께 서버로 전달하며, 서버에서는 Token 내부의 사인이 맞다고 확인이 되면 그에 걸맞은 권한을 client에 부여 한다. Session과 달리 서버는 별도의 Session id 관리를 하지 않고 해당 사인이 유효한지만 체크 한다
구조
Header, Payload, Verify signature 로 구성 되어 있다
HEADER - Algorithm & Token Type / 암호화(encryption) 되지 않음
“alg” : 암호화 알고리즘 방식
“typ” : 어떤 타입의 토큰인지 정의
PAYLOAD - DATA (수정 및 추가 가능) / Header와 같이 암호화 되지 않기 때문에 주요 정보는 넣지 않는다
VERIFY SIGNATURE
Header, Payload, Secret Key를 조합하여 암호화
만약 Secret Key 가 유출 되어 key를 새로 정의 해주었다면 이미 발급 된 Token 들은 무효(invalidate)가 된다.
JWT를 조사하면서 알게 된 사실이 JWT와 함께 이해 해야 하는 개념으로는
- 쿠키, 토큰, Session
이렇게 3가지가 대표적이라고 한다. JWT를 이해하기 위해서는 이 3가지의 개념도 함께 공부하는 것이 중요한 거 같아 곧 3개에 대해서도 정리하고 비교를 해보겠다
API (Application Programming Interface)
Application - 운영체제
Interface - 상호간에 소통을 위해 만들어진 접점
정의
- 컴퓨터나 컴퓨터 프로그램들 사이의 소통방법
- 코드들 끼리 서로 소통하기 위해 만들어짐
- Front-end 와 Back-end를 연결
WEB API
- 브라우저를 위해 만들어진 API
HTTP API
- Response와 Request로 client와 sever사이의 소통을 하는 API
Private API
- 사내에서 사용하는 API, 외부에 비공개
Open API, Public API
- 회사 내부에서 사용하는 API를 외부의 다른 사용자가 이용할 수 있도록 주소와 사용규칙을 공개해 놓은 것
- 공개된 back-end를 이용하고 Front-end만 만들어 쓰는 것을 severless라고도 부른다
- 공개함으로서 많은 유저들이 API를 사용하면 궁극적으로 회사, 서비스 커뮤니티에 많은 기여를 하게 된다
이번주 사용한 주요 API
로그인
@app.route('/login', methods=["POST"]) def sign_in(): id_receive = request.form['id_give'] pw_receive = request.form['pw_give'] pw_hash = hashlib.sha256(pw_receive.encode('utf-8')).hexdigest() # 패스워드 암호화 result = db.users.find_one({'id': id_receive, 'pw': pw_hash}) # 동일한 유저가 있는지 확인 # 동일한 유저가 있으면, 암호해독, 결과 -> 성공 및 환영인사. if result is not None: payload = { 'id': id_receive, 'exp': datetime.utcnow() + timedelta(seconds=60 * 60 * 24) } token = jwt.encode(payload, SECRET_KEY, algorithm='HS256') return jsonify({'result': 'success', 'token': token, 'msg': '환영합니다.'}) # 동일한 유저가 없으면, 결과 -> 실패, 다시 로그인. else: return jsonify({'result': 'fail', 'msg': '아이디/패스워드가 일치하지 않습니다.'})
server에서 전달 받은 토큰을 사용하여 쿠키 생성
// ajax 콜 app.py로 전송 및 로그인 진행 $.ajax({ type: "POST", url: "/login", data: { id_give: id, pw_give: pw }, success: function (response) { if (response['result'] == 'success') { $.cookie('mytoken', response['token'], {path: '/'}); alert(response['msg']) window.location.replace("/") } else { alert(response['msg']) } } })
페이지 이동시 서버단에서 쿠키값을 받아 로그인 유무 판별
token_receive = request.cookies.get('mytoken') # 쿠키값 받아 오기 # 쿠키값(로그인 판별) 여부에 따른 index.html 전송 자료 결정 if token_receive is not None: payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256']) user_info = db.users.find_one({"id": payload["id"]}) # DB users collection 에서 user 데이터 불러 오기 login_status = 1 # 로그인 판벌(bool 사용 해봐도 될듯) return render_template('index.html', posts=posts, user_info=user_info, login_status=login_status) else: login_status = 0 return render_template('index.html', posts=posts, login_status=login_status)
주간 마무리
이번 한주를 한마디로 정리하자면 '정신 없다' 이다. 너무 많은 인풋으로 인하여 말그대로 정신이 없었다.
항해 첫날 일일 회고때
"
코드를 잘 만들기 위한 기술도 중요하지만,
개발자 다운, 개발자에 맞는 마인드셋이 먼저라고 생각한다.
지금까지의 나의 습관 자체가 개발자와 너무 동 떨어져 있었다.
항상 기록하고, 정리하고, 깊게 사고 하는 습관을 만드는데 무엇보다 먼저 집중하겠다.
"
라며 팀원들 앞에서 나의 마음가짐을 발표하는 시간을 가졌다.
Daily Note 작성을 시작하였고, 배운 내용을 그때그때 기록하려고 노력했으며, 지금 그 내용들에 조금 더 조사를 통해 살을 붙여 이렇게 글을 올린다. 아직 부족함이 많아 이렇게 짧은 글을 쓰는데도 많은 시간을 쓰지만, 꾸준히 하게되면 개선 될 것이라고 믿어 의심치 않는다.
원하는 바 이룰때까지 ㄱㄱㄱ