flask, redis, retrofit을 이용한 android 로그인 서비스 구현하기

24
Flask, Redis, Retrofit 이용한 Android 로그인 서비스 구현하 2015.01.15 이화앱센터 안드로이드팀장 한만종

Upload: manjong-han

Post on 18-Jul-2015

2.610 views

Category:

Software


9 download

TRANSCRIPT

Flask, Redis, Retrofit을 이용한 Android 로그인 서비스 구현하기

2015.01.15

이화앱센터 안드로이드팀장 한만종

로그인이란?

Logging in or signing in or on is the process by which individual access to computer system is controlled by identifying and authenticating the user through the credentials presented by the user.

Wikipedia

Authentication? Authorization?

인증(authentication)은 자신이 누구라고 주장하는 사람을 확인하는 절차이다. 권한부여(authorization)는 가고싶은 곳으로 가도록 혹은 원하는 정보를 얻도록 허용하는 과정이다.

httpd.apache.org

로그인 구현 이렇게??

• “아이디는 사용자를 구분하는 누구나 알 수 있는 문자열.”

• “비밀번호는 안보이게 자주 쓰이는 MD5 암호화해서 보내자.”

• “DB에 저장된 아이디와 암호화된 비밀번호를 비교하면 되겠지.”

• “HTTP POST 방식은 비밀스럽게 통신하는 방식이야.”

• “로그인을 하고나면 로그아웃하기 전까지 로그인한 것으로 간주.”

로그인 구현 이렇게??

• “아이디는 사용자를 구분하는 누구나 알 수 있는 문자열.”

• “비밀번호는 안보이게 자주 쓰이는 MD5 암호화해서 보내자.”

• “DB에 저장된 아이디와 암호화된 비밀번호를 비교하면 되겠지.”

• “HTTP POST 방식은 비밀스럽게 통신하는 방식이야.”

• “로그인을 하고나면 로그아웃하기 전까지 로그인한 것으로 간주.”

안전한 로그인 구현 조건• 비밀번호를 포함한 개인정보는 전송 시 모두 암호화해야 한다.

• 또한, HTTP 보다는 HTTPS(SSL)를 이용해서 통신한다.

• HTTP POST는 GET과 비교해 파라미터들이 위치하는 곳이 다를 뿐 보안과는 무관하다. (패킷스니핑)

• MD5, SHA-1, SHA-256, SHA-512 등의 해싱은 무결성 인증을 위해 사용하는 것이지 암호화 알고리즘이 아니다. (MD5, SHA-1은 무력화되었다.)

• 로그인 성공은 사용자 “인증”을 완료했다는 것이며, 해당하는 “접근 권한”을 부여한다는 것이다. 그러나 이 상태(세션)는 적절한 시기에 만료시켜야 한다.

안전한 로그인 구현 예제

• REST API 지향

• RSA 암호화를 통해 개인정보를 암호화

• secure한 cookie를 이용해 RSA 개인키 보관

• token과 REDIS를 이용한 session 관리

Flask, Redis, Retrofit

• Python Flask: Django와 더불어 많이 사용되고 있는 Python 웹 프레임워크. Django는 Full-Stack 프레임워크인 반면에 Flask는 필요한 기능만 제공하는 Micro 프레임워크이다.

• Redis: REmote DIctionary System의 약자로 메모리 기반의 Key/Value 자료구조 서버이다.

• Retrofit: Square Inc.에서 개발한 Java용 네트워크 라이브러리. Android 개발에서는 Volley 이후로 많이 쓰이고 있다.

Flask?

http://127.0.0.1:5000/ 으로 접속 시 “Safety Login” 표시

Redis?

“myKey”라는 키로 “myValue”라는 값을 얻을 수 있음

Retrofit?

“/user/login”에 GET으로 요청해서 비동기로 응답받음

redis-pyPython에서 Redis를 연결하는 인터페이스 클라이언트

서버사이드 API 설계POST /api/user/signup: 회원가입

*편의상 DB 대신 상수를 이용한 점 양해바랍니다.

서버사이드 API 설계GET /api/user/login: RSA 공개키 발급

서버사이드 API 설계PUT /api/user/login: 로그인

서버사이드 API 설계GET /api/user/profile: 사용자 프로필 조회

Android 클라이언트 접속Retrofit을 이용한 서버사이드 API 인터페이스

Android 클라이언트 접속SignupActivity: 회원가입 요청

Android 클라이언트 접속LoginActivity: RSA 공개키 요청

Android 클라이언트 접속LoginActivity: 공개키를 이용한 RSA 암호화

Android 클라이언트 접속LoginActivity: 로그인 요청

안전한 로그인 구현 예제

지금까지 설명한 예제 소스코드를 다음에 공개했습니다.

https://gitlab.com/ewhappcenter/safety-login.git

안전한 로그인 구현 예제

• 이 예제는 “예시”로서 간단한 구현체이다. 따라서 다음과 같은 문제가 있으며, 실서비스에서 사용하는 것을 권장하지 않는다.

1. RSA 암호화를 해서 전송하더라도 중간자 공격에 취약하다. (SSL 연결 필요)

2. 전체 내용 자체를 RSA 암호화 하는 것만으로는 빠른 성능을 보장할 수 없다. (내용을 AES 암호화하고 AES 키를 RSA 암호화하는 방법을 추천)

감사합니다.이화앱센터 안드로이드팀장 한만종

[email protected]