JWT & API ?

Pink Chun·2022년 9월 25일
1

개발상식

목록 보기
1/4
post-thumbnail

1. JWT ?

JWT(Json Web Token)는 쿠키와 세션 같은 일련의 과정 속에서 나타난 하나의 인터넷 표준 인증 방식 으로 인증에 필요한 정보들을 Token에 담아 암호화 시켜 사용하는 것을 말한다.

2. JWT 는 어떤 상황에서 사용될까?

다음과 같은 상황에서 JWT 가 유용하게 사용 될 수 있다.

회원 인증 : JWT 를 사용하는 가장 흔한 시나리오이다. 유저가 로그인을 하면, 서버는 유저의 정보에 기반한 토큰을 발급하여 유저에게 전달해준다. 그 후, 유저가 서버에 요청을 할 때 마다 JWT를 포함하여 전달한다. 서버가 클라이언트에게서 요청을 받을때 마다, 해당 토큰이 유효하고 인증됐는지 검증을 하고, 유저가 요청한 작업에 권한이 있는지 확인하여 작업을 처리한다.

서버측에서는 유저의 세션을 유지 할 필요가 없다. 즉 유저가 로그인되어있는지 안되어있는지 신경 쓸 필요가 없고, 유저가 요청을 했을때 토큰만 확인하면 되니, 세션 관리가 필요 없어서 서버 자원을 많이 아낄 수 있다.

3. 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시간 유지
        }
        token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')#.decode('utf-8')

        return jsonify({'result': 'success', 'token': token,'msg':'접속을환영합니다'})
    # 찾지 못하면
    else:
        return jsonify({'result': 'fail', 'msg': '아이디/비밀번호가 일치하지 않습니다.'})

4. API란?

API는 정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘이다. 예를 들어, 기상청의 소프트웨어 시스템에는 일일 기상 데이터가 들어 있다. 휴대폰의 날씨 앱은 API를 통해 이 시스템과 "대화"하고 휴대폰에 매일 최신 날씨 정보를 표시한다.

5. API는 어떻게 작동할까?

API 아키텍처는 일반적으로 클라이언트와 서버 측면에서 설명된다. 요청을 보내는 애플리케이션을 클라이언트라고 하고 응답을 보내는 애플리케이션을 서버라고 한다. 따라서 날씨 예에서 기상청의 날씨 데이터베이스는 서버이고 모바일 앱은 클라이언트다.

6. API를 활용한 작동

@app.route('/')
def home():
    posts = list(db.page.find({}, {"_id": False}))
    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 render_template('index.html', user_info=user_info, posts=posts)

    except jwt.ExpiredSignatureError:
        return redirect(url_for("login", msg="로그인 시간이 만료되었습니다."))
    except jwt.exceptions.DecodeError:
        return redirect(url_for("login", msg="먼저 로그인 해 주시기 바랍니다"))

[내 이야기]
그리고 이상하게 안됐던 문제의 댓글기능코드

이게 이상하게

A페이지에 들어가도 똑같은 댓글
B페이지에 들어가도 똑같은 댓글
C페이지에 들어가도 똑같은 댓글


문제의 코드
@app.route("/view", methods=["POST"])
def view_post():
    view_receive = request.form['view_give']

    view_list = list(db.view.find({}, {'_id': False}))
    count = len(view_list) + 1

    doc = {
        'num': count,
        'view': view_receive,
        'done': 0
    }

    db.view.insert_one(doc)

    return jsonify({'msg': '등록완료'})


@app.route("/view", methods=["GET"])
def view_get():
    view_list = list(db.view.find({}, {'_id': False}))
    return jsonify({'view': view_list})

if __name__ == '__main__':
    app.run('0.0.0.0', port=5000, debug=True)

이런 코드를.....
몇시간을 고생하여 똑똑한 팀원님께서

@app.route("/view", methods=["POST"])
def view_post():
    view_receive = request.form['view_give']
    num_receive = request.form['num_give']

    doc = {
        'view': view_receive,
        'page_num': num_receive
    }

    db.view.insert_one(doc)

    return jsonify({'msg': '등록완료'})


@app.route("/view", methods=["GET"])
def view_get():
    view_list = list(db.view.find({}, {'_id': False}))
    reviews = list(db.page.find({}, {"_id": False}))

    return jsonify({'view': view_list, 'reviews': reviews})

이렇게 만들어 주셔서 구현이 가능하게 되었다.
나도 몇시간동안 해봤지만 시작이 잘 못된걸까 잘 되어가고 있다는 느낌도 받지 못했다.

지금으로서는 잘 하고 있는게 맞나 생각도 들지만 차차 성장해 가겠지! 일단 1주차 내 솔직한 소감은 살짝 재미를 느끼고 있다는 것이다! 굳!

profile
최룰루의 개발일지(코린이)

0개의 댓글