TWIL_스파르타코딩 웹개발 플러스 4주차

Refler·2021년 11월 28일

진즉에 작성했어야는데 급여명세서 이슈로 미루다미루다 이제야 작성..

셋째 주는 복습같은 느낌이라 새로운 내용이 거의 없었는데 4주차는 새로운 기능이 많아서 3주차에 일부 기능을 좀 분산해서 알려주었으면 좋았겠다고 생각했다.

1 Bulma

순수 CSS 프레임워크, 꾸미기 특화인듯 하다. 교육 중 사용한 버전은 0.9.1이지만 공식 홈페이지를 가보니 현재는 0.9.3이 최신인듯

https://bulma.io/documentation/overview/start/ 에서 import 주소를 확인할수 있다.

2 해시함수

임의의 데이터를 입력 받아 항상 고정된 길이의 임의의 값으로 변환해주는 함수

계정 비밀번호 저장 시 DB에서 비밀번호를 보더라도 바로 알아볼 수 없도록 비밀번호의 해시값을 DB에 저장하였다.

import hashlib

pw_hash = hashlib.sha256(비밀번호.encode('utf-8')).hexdigest()

문자열을 encode로 byte형태로 바꾸지 않으면 sha256으로 암호화 불가
sha256 자체는 object이기 때문에 hexdigest()는 필수라고 한다

hash = hashlib.sha256()
hash.update(b"해시화할 값")
hash.hexdigest()

이렇게도 가능한듯

3 JWT / 토큰

로그인한 사용자에게 서버에서 '토큰'을 발행하여 사용자가 유효한지 확인할 수 있다.
사용자 쪽에서는 웹페이지나 기능에 접근할 때 쿠키에 저장되어있는 토큰 정보를 서버에 전송하게 되는데, 이 때 토큰이 유효한지만 확인하면 페이지나 기능 접근을 허락/금지할 수 있다.

과정에서는 JSON Web Token(JWT)를 사용하였다

  • 로그인에 따른 토큰 발행
  • @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시간 유지
            }
            # SECRET_KEY가 있어야 추후 토큰 검증이 가능한데, 임의의 문자열로 가능하다
            token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
    
            return jsonify({'result': 'success', 'token': token})
        else:
            return jsonify({'result': 'fail', 'msg': '아이디/비밀번호가 일치하지 않습니다.'})
  • 서비스 사용시 토큰 확인
  • @app.route('/posting', methods=['POST'])
    def posting():
    	# 이건 클라이언트 쪽에서 받을 때 $.cookie('mytoken', response['token'], {path:'/'}) 로 받았기 때문에 mytoken
       	token_receive = request.cookies.get('mytoken')
    	try:
    		# 토큰 검증
    		payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
    		user_info = db.users.find_one({"username": payload["id"]})
    		... (작업)
    		return jsonify({"result": "success", 'msg': '포스팅 성공'})
    	
    	# 토큰이 만료되었거나 검증 실패한 경우
    	except (jwt.ExpiredSignatureError, jwt.exceptions.DecodeError):
    		return redirect(url_for("home"))

    4 조건부 삼항 연산자(ternary operator)

    Javascript에서 간단한 조건문이라면 아래와 같이 True/False에 따른 값을 불러올 수 있다

    # 조건이 True면 : 앞의 값을, False
    condition ? exprIfTrue : exprIfFalse 
    
    #다중 조건도 처리가 가능하다. Excel의 if 중첩을 생각하면 쉬울듯
    condition1 ? value1 : condition2 ? value2 : condition3 ? value3 : value4;

    5 기타

  • pymongo 값 정렬 및 갯수 제한 - sort, limit
  • # 결과값 뒤에 바로 .sort, .limit을 붙여주면 된다 
    # -1은 내림차순, 1은 오름차순
    list(db.posts.find({}).sort("정렬 기준", -1).limit(갯수 제한))
    
    # 여러 기준에 대해 정렬도 가능하다
    # pymongo.ASCENDING / DECENDING 으로도 오름/내림차순을 정할 수 있다
    list(db.posts.find({}).sort([("정렬 기준 1", pymongo.ASCENDING), 
    				("정렬 기준2",pymongo.DESCENDING)]).limit(갯수 제한))
    
    profile
    이제 시작

    0개의 댓글