쿠키 : 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일
세션 : 쿠키를 기반하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리
JWT : Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Web Token / 필요한 정보를 토큰 Body에 저장해 사용자가 가지고 있고, 그것을 증명서처럼 사용
★ JWT를 쿠키에 저장하여 사용 : flask_jwt_extended 라이브러리를 사용하여 set_access_cookies 및 set_refresh_cookies 활용!
사용하다 헷갈린 점 : Python에서 아래처럼 code를 넣으면, 아래 사진처럼 Database가 생성된다.
from pymongo import MongoClient
...
client = MongoClient('localhost', 27017)
db = client.dbname
...
db.users.insert_one({딕셔너리})
아직 제대로 이해하지 못한 부분이 너무 많다. (걱정이 태산..)
해결해야할 부분도 많다.
1. user data에 password 암호화 필요
2. db부분에서 foreignkey 및 참조, 조인 등 제대로 이해하지 못한 개념으로 팀원들을 괴롭힘..(잘 아시는 분들이라 계속 설명해주심)
3. 특히,아래와 같이 <_id>를 사용한 부분에 대해 명확하게 이해하지 못하고 있다......
@app.route('/article/<article_id>', methods=['GET'])
def read_articles(article_id):
article = db.articles.find_one({'_id' : article_id})
(익명과 실명 게시판이 있는 폐쇄적인 커뮤니티 웹페이지 작성中)
from flask import Flask, render_template, request, jsonify, redirect
from flask_jwt_extended import *
from pymongo import MongoClient
import datetime
app = Flask(__name__)
# JWT 매니저 활성화
app.config.update(DEBUG = True, JWT_SECRET_KEY = "thisissecertkey" )
# 정보를 줄 수 있는 과정도 필요함 == 토큰에서 유저 정보를 받음
jwt = JWTManager(app)
# JWT 쿠키 저장
app.config['JWT_COOKIE_SECURE'] = False # https를 통해서만 cookie가 갈 수 있는지 (production 에선 True)
app.config['JWT_TOKEN_LOCATION'] = ['cookies']
app.config['JWT_ACCESS_COOKIE_PATH'] = '/' # access cookie를 보관할 url (Frontend 기준)
app.config['JWT_REFRESH_COOKIE_PATH'] = '/' # refresh cookie를 보관할 url (Frontend 기준)
# CSRF 토큰 역시 생성해서 쿠키에 저장할지
# (이 경우엔 프론트에서 접근해야하기 때문에 httponly가 아님)
app.config['JWT_COOKIE_CSRF_PROTECT'] = True
# Mongo DB
client = MongoClient('localhost', 27017)
db = client.dbname
# test - id
db.users.insert_one({'user_id' : 'test','user_pwd': 'test', 'user_name' : '정글','user_email': '.com','user_ordinal' : 1})
@app.route('/')
def home():
return render_template('home.html')
# 회원가입
@app.route('/register', methods=['GET','POST'])
def register():
if request.method == 'GET':
return render_template("register.html")
else:
#회원정보 생성
username = request.form.get('username')
email = request.form.get('email')
ordinal = request.form.get('ordinal')
userid = request.form.get('userid')
password = request.form.get('password')
re_password = request.form.get('re_password')
userinfo={'user_id':userid, 'user_name':username, 'user_pwd':password, 'user_email':email, 'ordinal':ordinal}
if not (userid and username and password and re_password) :
return "모두 입력해주세요"
elif password != re_password:
return "비밀번호를 확인해주세요"
else: #모두 입력이 정상적으로 되었다면 밑에명령실행(DB에 입력됨)
db.users.insert_one(userinfo)
return "회원가입 완료"
return redirect('/register')
# 로그인
@app.route('/user/login', methods = ['POST'])
def login():
user_id = request.form['id_input']
user_pw = request.form['pw_input']
print(user_id)
print(user_pw)
## *** find_one 시에 아무것도 없을 때의 데이터 형태 알아야함 ***
user = db.articles.find_one( {'user_id' : user_id},{'user_pwd' : user_pw})
if user is None:
return jsonify({'login' : False})
access_token = create_access_token(identity = user_id, expires_delta = False)
refresh_token = create_refresh_token(identity = user_id)
resp = jsonify({'login' : True})
# 서버에 저장
set_access_cookies(resp, access_token)
set_refresh_cookies(resp, refresh_token)
print(access_token)
print(refresh_token)
return resp, 200
# 목록페이지 보기
@app.route('/article/known', methods=['GET'])
def get_article():
articles = list(db.articles.find({},{'_id':False}).sort('article_created_at', -1))
return jsonify({'result':'success', 'articles': articles})
# 실명게시판 글쓰기버튼 작동
@app.route('/article/known/write')
def modify_articles():
return render_template('modify.html', article_is_secret = False)
# 익명게시판 글쓰기버튼
@app.route('/article/unknown/write')
def modify_articles():
return render_template('modify.html', article_is_secret = True)
# 실명게시판 글쓰기 완료버튼 작동
@app.route('/article/known/post', methods=['POST'])
def post_articles():
article_title = request.form['title_input']
article_content = request.form['content_input']
now = datetime.datetime.now()
article_created_at = now.today() # 시간
article_modified_at = now.today() # 시간
article_view = 0
article_like = 0
article_is_secret = False
article_user_id = get_jwt_identity()
db.articles.insert_one({'article_title' : article_title, 'article_content' : article_content, 'article_created_at' : article_created_at,
'article_modified_at' : article_modified_at,'article_view' : article_view, 'article_like' : article_like, 'article_is_secret' :article_is_secret,
'article_user_id' : article_user_id})
return redirect('/article/known')
# 실명게시판 상세페이지 (GET ? POST ?)
@app.route('/article/<article_id>', methods=['GET'])
def read_articles(article_id):
article = db.articles.find_one({'_id' : article_id})
user_id = get_jwt_identity()
return render_template('read.html', article = article ,user_id = user_id)
# 수정 버튼을 누르면
@app.route('/article/<article_id>/modify', methods=['PUT'])
def modify_articles(article_id):
article = db.articles.find_one({'_id' : article_id})
return render_template('modify.html', article = article)
# 수정완료 버튼을 누르면
@app.route('/article/<article_id>/modify_pro')
def modify_pro(article_id):
article_title = request.form['title_input']
article_content = request.form['content_input']
now = datetime.datetime.now()
article_modified_at = now.today()
db.articles.update_one({'_id': article_id }, {'$set':{'article_title' : article_title,
'article_content' : article_content,'article_modified_at' : article_modified_at}})
return redirect('/article/known')
# 삭제
@app.route('/article/<article_id>/delete', methods=['DELETE'])
def delete_articles(article_id):
db.articles.delete_one({'_id' : article_id})
return redirect('/article/known')
# 익명게시판 글쓰기 완료시 작동
@app.route('/article/unknown', methods=['POST'])
def post_articles():
article_title = request.form['title_input']
article_content = request.form['content_input']
now = datetime.datetime.now()
article_created_at = now.today() # 시간
article_modified_at = now.today() # 시간
article_view = 0
article_like = 0
article_is_secret = True
article_user_id = get_jwt_identity()
db.articles.insert_one({'article_title' : article_title, 'article_content' : article_content, 'article_created_at' : article_created_at,
'article_modified_at' : article_modified_at,'article_view' : article_view, 'article_like' : article_like, 'article_is_secret' :article_is_secret,
'article_user_id' : article_user_id})
return redirect('/article/known')
# article_writer = "{}기 {}".format(user['user_ordinal'],user['user_name'])
if __name__ == '__main__':
app.run('127.0.0.1', port=5000, debug=True)
현재 시각 새벽 2시인데, 강의실에 혼자 남았다.. 지금도 제일 부족한 수준 같은데, 앞으로는 더 걱정이다.. 그래도 포기하지 말고 끝까지 달리자