인증

2021. 8. 24. 03:39Mobile App

인증(authentication)은 사용자의 신원을 확인하는 절차이다. 공통적으로 구현되는 엔드포인트들 중 하나이다.

인증절차의 구현방법, 사용자의 비밀번호 암호화 등에 대해서 알아보자

 

1.가입절차를 통해 사용자의 아이디와 비밀번호를 생성

2. 가입한 아이디와 비밀번호를 데이터베이스에 저장, 비밀번호 암호화해서 저장

3. 사용자가 로그인할 때 본인의 아이디와 비밀번호 입력

4. 사용자가 입력한 비밀번호를 암호화한 후, 그 값을 이미 암호화되어서 DB에 저장된 비밀번호와 비교한다

5. 비밀번호가 일치하면 로그인 성공

6. 로그인에 성공하면 백엔드 API 서버는 access token 을 프론트엔드 혹은 클라이언트에게 전송한다.

7. 프론트엔드 서버는 로그인 성공 후 다음부터는 해당 사용자의 access token을 첨부해서 request를 서버에 전송함으로써 매번 로그인하지 않아도 되도록 한다.

 

비밀번호 암호화

필요성

1. 외부 해킹에 노출되었을 경우 대비 

2. 내부 인력에 의해 데이터베이스가 노출되었을 경우에 대비하기 위함

 

단방향 해시함수가 일반적으로 쓰인다. 복호화를 할 수 없는 암호화 알고리즘이다. 온진히 본래의 비밀번호 값을 알지 못하도록 방지하는데에 목적이 있다.

애벌런시 효과: 원본값은 굉장히 비슷하지만 암호화된 해시함수 값은 완전히 다른것

파이썬에서는 hashlib모듈을 사용하면 암호화할 수 있다.

 

bcrypt 암호 알고리즘

단방향 해시함수의 취약점들을 보안하기 위한 방법

1. salting: 실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해시 값을 계산하는 방법, 비밀번호에 랜덤 값을 더해서 해시화를 한다. rainbow attack (미리 해시값들을 계산해 놓은 테이블로 해시 함수 값을 역추적해 해킹)와 같은 공격 무효화

2. 키 스트레칭 : 단방향 해시값을 계산한 후 그 해시값을 또 해시하고 이를 여러번 반복하는 방법

 

salting과 키 스트레칭을 구현한 해시 함수 중 가장 널리 사용되는 bcrypt

 

 

access token

현재의 HTTP 통신에서 이전에 이미 인증이 진행됐는지 알지 못하므로 

사용자의 로그인 여부를 알 수 있다.

 

JWT

access token을 생성하는 방법 중 가장 널리 사용되는 기술

Json 데이터를 token으로 변환하는 방식

 

구조

-header: 두 부분으로 되어있으며, 토큰타입(JWT)그리고 사용되는 해시 알고리즘을 지정한다.

헤더를 Base64URL 방식으로 코드화해서 JWT의 첫 부분을 구성한다.

{
"alg":"HS256",
"typ":"JWT"
}

-payplad: JWT를 통해 실제로 서버간에 전송하고자하는 데이터 부분이다. 

HTTP 메시지의 body부분과 비슷하다.

{
"user_id":2.
"exp":1539517391
}

-signature: JWT가 원본 그대로라는 것을 확인할 때 사용되는 부분이다.

signature부분이 잘못되어있으면 JWT를 누군가 임의적으로 바꾼 것이나 해킹의 목적 등으로 임의로 생성한 것이라고 간주할 수 있다.

 

JWT를 사용할 때 조심해야할 점은 바로 signature 부분 외에 다른 부분들은 암호화가 아닌 Base64URL 코드화되어 있다는 것이다.

 

이처럼 header, payload, signature로 구성되어있다. 

따라서 일반적으로 xxxxx.yyyyy.zzzzz 형태이다.

 

 

파이썬에서 JWT 구현하기!

PyJWT 라이브러리를 사용한다. 

pip install PyJWT를 인스톨 하기 ~

 

1. import PyJwt

2. JWT의 payload 부분에 들어갈 JSON 데이터생성

3. JWT의 signature 부분을 암호화할 때 사용할 비밀키 지정

4. JWT의 signature부분을 암호화할 때 사용할 암호 알고리즘을 지정

5. JWT를 생성

6. 5에서 만든 JWT를 복호화하여 원본 payload 데이터를 읽어들인다. 

 

 

인증엔드포인트 구현하기

1. 회원가입 엔드포인트 수정

이전에 구현한 sign-up 엔드포인트는 사용자의 비밀번호를 암호화하지 않고 그대로 저장한다 . 

따라서 bycrypt를 사용해 암호화해서 저장하도록 구현하기 !

hashpw 함수 사용: 스트링 값이 아닌 byte값을 받으므로 사용자의 비밀번호를 UTF-8엔코딩으로 byte로 변환해서 hashpw 함수에 넘겨주며 호출

gensalt함수 사용: 사용자의 비밀번호에 salting을 추가하여 암호화

 

2. 인증 엔드포인트 수정

1)HTTP POST request에 JSON 데이터로 해당 사용자의 아이디와 비밀번호를 전송받아서

2)데이터베이스에 저장되어 있는 해당 사용자의 비밀번호와 동일한지 확인하면 된다. 

3)동일하면 JWT access token을 생성해서 보내면된다.

 

row의 값이 None이면 해당 사용자가 존재하지도 않는다는 뜻!

만일 사용자가 존재한다면 해당 사용자의 암호화된 비밀번호와 사용자가 전송한 비밀번호를 bcrypt 모듈의 checkpw 함수를 사용해서 동일한지 확인한다.

사용자의 비밀번호가 확인되었으면 JWT생성

JWT의 유효기간(exp)을 설정하는데 유효기간이 지나면 해당 JWT는 무효화가 되므로 새로 인증을 받아야한다.

 

 

3. 인증절차를 다른 엔드포인트에 적용하기

인증된 사용자만 사용가능하도록 다른 엔드포인트들을 수정해야한다!

tweet, follow, unfollow 등 인증절차가 여러 함수에서 공통적으로 필요하다!

이러한 경우 파이썬의 decorator를 사용하자 !

 

decorator는 어떠한 함수를 다른 함수가 실행되기 전에 자동으로 먼저 실행될 수 있도록 해주는 문법

이름 그대로, 함수를 다른 함수에 장식처럼 첨부

주로 공통적으로 항상 먼저 실행되어야하는 코드가 있을때 사용

함수 이름 앞에 @를 붙여서 적용하고자 하는 함수의 정의 부분 위에 지정

functools 모듈의 wraps decorator 함수를 사용한다

 

함수 인자가 *args, **kwargs 로 지정해줘서 모든 형태의 인자를 받을 수 있도록한다.

 

 

tweet, follow, unfollow 등의 엔드포인트에 decorate 함수를 적용시켰으니 해당 엔드포인트들을 실행시키기 위해서는 먼저 로그인을 해야한다. 

왜냐 그렇게 설정했으니께 ! 로그인이 인증절차임!

 

내가 만들고자하는 서비스에서도

(환자)로그인, 본인정보수정에서 필요하다.운동목록, 운동순위를 확인하는 부분은 필요없을 듯 ! 아마도,?

(관리자)로그인, 운동목록수정, 환자정보열람, 환자운동목록수정에서 필요하다 아마도..?

 

수지랑 이야기해보고 구체화시키기 !!

🧡미정이 화이팅 !!🧡

'Mobile App' 카테고리의 다른 글

react native 앱 따라 만들기  (0) 2021.09.23
react-native 개발 환경 설정  (0) 2021.09.23
API와 HTTP의 관계  (0) 2021.08.09
2-3.모델로 데이터 처리하기  (0) 2021.08.06
2-2.블루프린트로 라우트 함수 관리하기  (0) 2021.08.05