일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Pessimistic Lock
- 서버개발캠프
- JPA 동시성
- 디자인 패턴
- annotation
- 캠프
- 개발
- 낙관적락 비관적락 차이
- Android
- Redis
- JPA 낙관적락
- JPA
- 스마일게이트
- JPA Lock
- spring security
- JPA 비관적락
- Transaction isolation level
- 서버
- 암호화
- spring
- flask
- bean
- 스프링 로그
- Optimistic Lock
- spring security 인증
- Inno DB
- 스프링 log
- 스프링
- 안드로이드
- component
- Today
- Total
모르는게 많은 개발자
[스마일게이트 서버 개발 캠프 4기]#3 두번째 개인과제 리뷰(로그인 인증 서버개발) 본문
스마일게이트 서버개발 캠프 두번째 개인과제는 인증서버개발이었다.
처음 인증서버를 들었을때는 뭔지 감이 오지 않았다. 지금까지 개발을 해오면서 구현해온 로그인, 회원가입 방식은 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를 사용했다.
위의 처리를 위해 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)형식을 지켜서 이름을 설정하라
'스마일게이트서버캠프4기' 카테고리의 다른 글
[스마일게이트 서버 개발 캠프 4기]#6 후기 (0) | 2020.03.08 |
---|---|
[스마일게이트 서버 개발 캠프 4기]#5 몬스터 HP 동기화(TCP 소켓 통신중 의도치 않은 패킷 받을 때) (0) | 2020.02.29 |
[스마일게이트 서버 개발 캠프 4기]#4 리눅스 ssh를 꺼도 프로세스 유지방법 (nohup) (0) | 2020.02.24 |
[스마일게이트 서버 개발 캠프 4기]#2 게임 채팅 서버 구현(로그인, 채팅) (0) | 2020.01.25 |
[스마일게이트 서버 개발 캠프 4기]#1 첫번째 개인과제 리뷰(Shortening URL) (0) | 2020.01.18 |