9/19일 월요일 항해99 9기가 정식 시작되었다. 목요일까지 4일간 미니 프로젝트를 마무리하고 금요일부터는 자바로 알고리즘 문제를 푸며 자바 공부를 하고 있다.
미니 프로젝트는 주특기 언어 공부에 앞서 백/프론트 구분 없이 조원 3-4명이서 API 작성으로 클라이언트-서버 통신에 대해 이해하고, JWT로 로그인 기능 구현을 하며 JWT를 이해하는 것을 목표로 하는 세션인 것 같다.
API(Application Programming Interface) 는 표준화된 문법 및 의사소통 방법을 만들어 애플리케이션과 데이터베이스의 상호작용이 가능하게 한다. 쉽게 말해 어떤 응용프로그램이 자신이 가지고 있는 정보를 제공하기 위해 어떤 방식으로 통신할 것인지에 대해 정리한 규격을 API라고 한다.
미니프로젝트에서 아래와 같은 GET, POST 요청 API를 작성하여 서버와 클라이언트를 연결해서 웹사이트 하나를 완성하였다.
@app.route('/user/<username>')
def user(username):
# 각 사용자의 프로필과 글을 모아볼 수 있는 공간
token_receive = request.cookies.get('mytoken')
try:
payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
status = (username == payload["id"]) # 내 프로필이면 True, 다른 사람 프로필 페이지면 False
user_info = db.users.find_one({"username": username}, {"_id": False})
return render_template('user.html', user_info=user_info, status=status)
except (jwt.ExpiredSignatureError, jwt.exceptions.DecodeError):
return redirect(url_for("home"))
JWT(JSON Web Token)는 토큰 기반의 인증 방식이라고도 불리며, JSON 객체를 사용해 정보를 안정성 있게 전달하는 웹표준이다. 또 다른 HTTP 기본 인증 방식으로는 Session / Cookie 방식이 있다.
토큰을 만들기 위해서는 크게 3가지, Header,Payload, Verify Signature가 필요하다.
Header : 위 3가지 정보를 암호화할 방식(alg), 타입(type) 등이 들어간다.
Payload : 서버에서 보낼 데이터가 들어간다. 일반적으로 유저의 고유 ID값, 유효기간이 들어간다
Verify Signature : Base64 방식으로 인코딩한 Header,payload 그리고 SECRET KEY를 더한 후 서명된다.
아래는 웹개발 강의에서 쓴 로그인 기능 파이썬 (서버) 코드이다. payload에 유저의 id, 로그인 유효기간이 들어가고, header에 algorithm='HS256' 이 들어간다.
@app.route('/sign_in', methods=['POST'])
def sign_in():
# 로그인
username_receive = request.form['username_give']
password_receive = request.form['password_give']
pw_hash = hashlib.sha256(password_receive.encode('utf-8')).hexdigest()
result = db.users.find_one({'username': username_receive, 'password': pw_hash})
if result is not None:
payload = {
'id': username_receive,
'exp': datetime.utcnow() + timedelta(seconds=60 * 60 * 24) # 로그인 24시간 유지
}
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256').decode('utf-8')
return jsonify({'result': 'success', 'token': token})
# 찾지 못하면
else:
return jsonify({'result': 'fail', 'msg': '아이디/비밀번호가 일치하지 않습니다.'})
우리 팀 프로젝트 작품: http://hanghae9.shop
프로젝트 S.A: 2022.09.22 - [프로젝트] - [날씨일기] 미니프로젝트 S.A(Starting Assignment)
프로젝트 회고: 2022.09.23 - [프로젝트] - [날씨일기] 미니프로젝트 완성
금요일부터 시작한 자바 알고리즘 문제 풀이는 github에 정리하고 있으며 헷갈리거나 잘 모르는 문법은 이 블로그에 정리하려고 한다.
Github 알고리즘 문제 풀이 : https://github.com/Suyoung225/JavaPrac/tree/main/programmers
정규표현식 정리: 2022.09.25 - [알고리즘] - 정규 표현식 Regular expressions (Regex)
'항해99 > WIL' 카테고리의 다른 글
[WIL] 항해99 7주차 회고 (0) | 2022.11.06 |
---|---|
[WIL] 항해99 5주차 회고- CORS (0) | 2022.10.26 |
[WIL] 항해99 4주차 회고- ORM, SQL, MVC (0) | 2022.10.17 |
[WIL] 항해99 3주차 회고 - DI, IoC, Bean (0) | 2022.10.09 |
[WIL] 항해99 2주차 회고 - JVM, 객체지향 프로그래밍 (0) | 2022.10.02 |
댓글