파비의 매일매일 공부기록

깔끔한 파이썬 탄탄한 백엔드 - #7 인증 본문

Study/Python

깔끔한 파이썬 탄탄한 백엔드 - #7 인증

fabichoi 2021. 8. 3. 23:30

이번장은 정말 중요하기도 하고 잘 모르기도 하면서 궁금했던 '인증'에 대한 내용이다.

private/public API 상관없이 기본적인 인증을 요구한다.

 

로그인 절차를 간략화하면 다음과 같다.(이미 계정이 존재하는 경우)

1. 로그인 시 받은 아이디와 비번을 암호화 후 DB에 저장된 비밀번호와 비교

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

3. 로그인 성공 후 access token을 클라이언트에 전송.

4. 클라이언트는 수신한 access token을 이용하여 매번 로그인하지 않고 request.

 

그다음은 단방향 해시 함수에 대한 설명인데, 간단히 요약하면

'abcd'라는 문자열을 단방향 해시 함수에 넣으면 항상 'woiehflskdfl' 이런 식으로 사람이 식별하기 어려운 값으로 리턴해준다.

 

그런데 이 해시 함수도 해킹이 가능하다.

어떤 해시 함수를 사용하는지를 알면, 랜덤 문자열들을 가지고 해시 함수를 통과 한 뒤 비교하면 된다. (rainbow attack)

 

그래서 이를 막기 위해 

salting : 실제 비번 이외에 랜덤 데이터를 더해서 해시 값을 계산하는 방법.

key stretching : 해시 함수를 반복 적용시키는 방법. 여러 번 해시 함수를 적용할수록 rainbow attack에 강력해짐(해시 함수를 통과하는 시간이 길어지므로)

를 구현한 라이브러리를 사용하는데 

그중 가장 널리 사용되는 것이 bcrypt다.

 

Access Token

- 로그인 성공 후, 백엔드 API 서버는 클라이언트에게 Access Token을 보냄.

- 이를 이용해서 각 Request시에 로그인할 필요 없이 통신 가능.

 

JWT(JSON Web Tokens)

- Access Token을 생성하는 여러 가지 방법 중, 가장 널리 사용하는 기술

- JSON 데이터를 Token으로 변환하는 방식.

- JSON 데이터를 그대로 보내면 해킹 가능성이 있으므로 Tokenizer를 수행함.

- 또한 만약 해킹을 위해 가짜 JWT를 전송하더라도 백엔드 API 서버에서 체크가 가능하므로 해킹을 방지할 수 있음.

- header / payload / signature의 세 부분으로 구성되어 있음

- header와 payload는 Base64 URL 방식으로 인코딩 되어 있음. 암호화되지 않았으므로 민감한 정보는 넣지 말 것.

- signature는 header와 payload, JWT secret를 헤더에 지정된 암호화 알고리즘으로 암호화

- 파이썬에서 PyJWT 등을 사용해서 JWT 구현 가능

 

나머지 책 내용은 라이브러리를 이용해서

기존에 구현했던 API 엔드 포인트를 수정한다.

 

나는 아직도 공부가 많이 필요한 것 같다.

전 직장에서는 거의 SQL만 사용했었다 보니

이번장에서 다룬 '인증'에 대한 개념도 전혀 모르고 있었던 것 같아서 조금 부끄럽다.

 

그만큼 더 지식과 경험을 쌓아야지.

역시 실무를 해보는 게 저어어엉말 중요하다. 책을 보는 것만으로는 한계가 있다. 확실히.

반응형
Comments