모르는게 많은 개발자

[스마일게이트 서버 개발 캠프 4기]#3 두번째 개인과제 리뷰(로그인 인증 서버개발) 본문

스마일게이트서버캠프4기

[스마일게이트 서버 개발 캠프 4기]#3 두번째 개인과제 리뷰(로그인 인증 서버개발)

Awdsd 2020. 2. 10. 00:16
반응형

스마일게이트 서버개발 캠프 두번째 개인과제는 인증서버개발이었다.

처음 인증서버를 들었을때는 뭔지 감이 오지 않았다. 지금까지 개발을 해오면서 구현해온 로그인, 회원가입 방식은 DB에 접근해 아이디 있는 지 없는지 체크해서 로그인 이런 간단한 방식만 생각했기 때문이다. 하지만 이번 과제를 수행하면서 회원가입, 로그인에 정말 많은 기능들이 들어간다는 것을 개발하면서 많이 느껴볼 수 있었다.

 

1. 기능 목록

프로젝트 기능 목록

 

2. 아키텍처

개인 과제 요구사항을 다 충족하기위한 아키텍처이다. 이번 프로젝트에서 Redis, Flask, Ajax, SMTP를 처음으로 사용해볼 수 있었다.

각각의 역할은 다음과 같다.

아키텍처

1. Flask - Python으로 제작 가능한 웹 서버이다.

첫번째 개인과제를 PHP로 구현하고, 캠프장님이 다음 과제는 PHP를 추천하지 않으셔서 Flask를 공부하며 프로젝트를 진행했다. 전체 웹서버 관리용으로 사용했다.

 

2. Redis - Key-Value 형식으로 되있는 비관계형 데이터베이스

 이번 프로젝트를 진행하면서 처음으로 알게된 DBMS이다. Redis를 공부하면서 Redis가 얼마나 편리한지 알 수 있었다. 일단, 데이터 읽는 속도가 어마어마하게 빠르다는 것이다. 또한 데이터 하나하나마다 Expiration(만료)를 설정해 일정시간후에 데이터가 알아서 자동으로 삭제된다는 것이다. 그래서 Redis를 이용해 유저 로그인에서 세션관리용도로 사용했다.

 

3. SMTP - 이메일 전달 프로토콜

회원가입때 이메일 인증 요구사항이 있어 적용하였다. GmailSMTP를 이용했다.

 

4. Mysql - RDBMS

유저 정보 데이터를 저장하기 위한 DBMS

 

5. HTML, CSS, JS - 웹 제작 언어

웹 제작을 위해 사용.

 

6. Ajax - 비동기 웹 개발

이메일 인증, 데이터 가져오기등에서 비동기적인 구현이 필요해 사용

 

3. 구현

 

3-1. 회원가입

회원가입을 진행할 때 먼저 이메일 인증을 받아야하게끔 구현했다. 이메일 인증시 인증 됬다는 데이터를 서버에서 비동기적으로 전송받기 위해 Ajax를 사용했다.

 회원가입 폼

 

이메일 인증 
이메일 인증
Redis에 저장된 이메일 인증 토큰
이메일 인증시 완료 표시

위의 처리를 위해 Ajax를 사용했다. Redis에 들어간 데이터는 3분후에 만료된다. 즉 이메일 인증을 3분안에 하지 않을시 이메일 인증이 되지 않게끔 구현했다.

#Ajax 코드
$('#certification').on("click", function() {
    if (!email_validate_check()) {
        return 0;
    }
    $.ajax({
        type: "GET",
        url: "/email",
        async: false,
        data: { address: $("#email").val() },
        success: function(data) {
            if (data['check'] == 'true') {
                alert('이메일로 인증을 진행해주세요');
                $('#certification').hide();
                $('#email').attr("readonly", true);
                emailCompleteCheck($("email").val());
            } else {
                alert('다른 이메일을 사용해주세요');
            }
        },

    })
})
#Flask 처리
@app.route("/email", methods=['POST', 'GET'])
def email_certification():
    email_address = request.args.get('address')
    if dbMng.email_overlap_check(email_address):
        # redis에 이메일 인증키 저장
        email_uuid = redis_sign_up_mng.create_certification_key(email_address)
        email_send(email_uuid, email_address, 0)
        return jsonify({
            "check": "true"
        })
    return jsonify({
        "check": "false"
    })

 

3-2. 로그인

로그인 폼

@app.route("/trylogin", methods=['POST', 'GET'])
def try_login():
    #일치할 시 redis에 email, value(uuid) expire적용후 저장 -> 쿠키에 저장
    if request.method == 'POST':
        if db_manage.login_check(request.form.get('email'), request.form.get('password')):
            email = request.form.get('email')
            session['email'] = email
            print('세션 : '+str(session['email']))
            token = redis_login_up_mng.insert_uuid_cookie(email)       #redis에 토큰 저장
            res = make_response(redirect("/main"))
            res.set_cookie("token", str(token))                     #쿠키 설정
            return res
    return error_page(error=None)

로그인 시도시 DB의 데이터와 비교하고 성공시 redis와 쿠키에 이메일과 UUID를 넣고 API호출시 마다 쿠키와 redis데이터를 비교하도록 구현했다.

 

3-3. 관리자 페이지

관리자 페이지
유저 정보 변경 페이지

 

4. 피드백

1. 비밀번호 salt의 문자 개수를 4개로 하고 작업했지만 보통 현업에서는 10글자를 설정

2. Flask에서도 application에 모든 API 함수를 넣지 말고  blueprint, flask rest api를 활용하라

3. 회원가입시 이메일 인증은 회원가입을 완료한 상태에서 메일 인증을 받도록 하는게 일반적

4. 파이썬 네이밍 방식은  _(underbar)형식을 지켜서 이름을 설정하라

반응형
Comments