1. 인증 : 사용자의 신원을 확인
애플리케이션에서 사용자가 로그인 할 때 아이디와 비밀번호를 확인하는 절차
- 가입 : 사용자의 아이디와 비밀번호 생성
- 가입한 사용자의 아이디와 비밀번호는 암호화 해서 저장 DB에 저장
- 로그인 시 본인의 아이디와 비밀번호 입력
- 비밀번호 입력 시 DB에 저장된 암호화 되어있는 비밀번호와 비교
- 비밀번호 일치 시 로그인 성공
- 로그인 성공 시 API 서버가 access token을 클라이언트에게 전송
- 로그인 성공 후 프론트엔드 서버에서 access token을 첨부하여 request를 서버에 전송 (매번 로그인 하지 않도록)
2. 사용자 비밀번호 암호화
- 암호화 하는 이유 : 외부 해킹공격, 내부의 DB 접근 시 비밀번호를 모르게 하기 위함
- 암호화 방법 : 단방향 해시 함수 사용 (복호화 될 수 없음)
- *복호화(decoding) : 부호화(encoding) 된 부호(code)를 부호화 되기 이전 상태로 되돌리는 것. 암호화와 반대 개념
- 파이썬 단방향 해시 함수 모듈
>>> import hashlib # 모듈 호출
>>> m = hashlib.sha256() # sha256 암호 알고리즘 선택
>>> m.update(b"test password") # 인자로 암호화하고싶은 값을 넣어줌.
>>> m.hexdigest() # 암호화된 값을 16진수(hex)값으로 읽음
'0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e'
- update() : b는 update 메소드가 바이트 값을 받기 때문에 문자열 앞에 b 붙여줌
- 하지만 취약점이 있어서 다른 방법을 사용함 (다양한 스트링값을 조합 -> 암호화 -> 해시값끼리 매칭)
3. bcrypt 암호 알고리즘
- salting : 실제 비번 외에 랜덤 데이터를 더해서 해시 값을 계산
- 키 스트레칭 : 단반향 해시 값을 계산 후 그 값을 또 해시.. 여러 번 반복하는 방법
- bcrypt : salting과 키 스트레칭을 구현 한 해시 함수 중 가장 많이 사용되는 것
단방향 암호화 하기 위해 만들어진 해시 함수
>>> import bcrypt
>>> bcrypt.hashpw(b"secret password", bcrypt.gensalt())
b'$2b$12$et0UptybyGzX/rgehnFseuPoakGJxQJpL.qcrnMPGXNoRused1vPq'
>>> bcrypt.hashpw(b"secret password", bcrypt.gensalt()).hex()
'243262243132243154796b6c55414367516d54396935344b644a51432e48534673504662643746374636626465726d7841526e672f55756a4f4c6457'
>>>
- hashpw : 2개의 인자 (b"비밀번호", bcrypt.gensalt())
gensalt() : salt값 생성 - hex() : 16진수 값으로 생성
4. access token
- 로그인 정보를 담고 있음
- HTTP 통신의 독립적인 성질 때문에 요청 처리시 필요한 데이터를 첨부하여 요청을 보내야 함
- 백엔드 API에서 access token을 생성 후 프론트 엔드로 보내고 프론트에서는 다시 백엔드 서버에 HTTP 요청을 보낼 때 첨부해서 보냄.
- 백엔드 API 서버에서는 프론트엔드가 보낸 access token으로 사용자의 로그인 여부 확인
5. JWT (JSON WEB Tokens)
- access token을 생성하는 방법
- Json 데이터를 token으로 변환하는 방식
6. JWT의 구조
xxxxxx.yyyyyy.zzzzzz
header payloda signature
1) header
토큰 타입(JWT), 해시알고리즘 지정
Base64URL 방식으로 코드화
{
"alg" : "HS256",
"typ" : "JWT"
}
2) payload
JWT를 통하여 실제로 서버에 전송하고자 하는 데이터 부분. HTTP의 body와 비슷하다.
Base64URL 코드화 (암호화가 아니므로 민감한 정보는 넣지 않는다.)
{
"user_id": 2,
"exp" : 1539517391
}
3) signature
- JWT가 원본임을 확인 할 때 사용되는 부분
- Base64URL로 코드화된 header, payload, JWT secret을 헤더에 지정된 암호 알고리즘으로 암호화 하여 전송.(복호화 가능한 암호)
- 프론트엔드에서 백엔드 서버로 JWT를 전송하면 서버에서 JWT signature 부분을 복호화 하여 서버에서 생성한 JWT가 맞는지 확인
- signature 부분이 잘못되어 있으면 JWT를 누군가 임의적으로 조작했거나 해킹 등의 목적으로 생성한 것
7. PyJWT
JWT를 사용할 수 있는 파이썬 라이브러리
>>> import jwt
>>> data_to_encode = {"some": 'payload'} # payload에 들어갈 JSON데이터
>>> encryption_secret = 'secret' # signature 부분 암호화 시 사용할 비밀 키
>>> algorithm = 'HS256' # signature 암호화 시 사용할 알고리즘 지정
>>> encoded = jwt.encode(data_to_encode, encryption_secret, algorithm=algorithm) #JWT 생성
>>> print(encoded)
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzb21lIjoicGF5bG9hZCJ9.Joh1R2dYzkRvDkqv3sygm5YyK8Gi4ShZqbhK2gxcs2U
>>> jwt.decode(encoded, encryption_secret, algorithms=[algorithm]) # JWT를 본호화 하여 원본 payload 읽기
{'some': 'payload'}
'Python > Flask' 카테고리의 다른 글
[미니터] 인증 - 인증 decorator 함수 (0) | 2022.07.15 |
---|---|
[미니터] 인증 - sign-up, login (0) | 2022.07.14 |
[미니터] DB연결 - 타임라인 (0) | 2022.07.14 |
[미니터] DB연결 - 팔로우와 언팔로우 (0) | 2022.07.14 |
[미니터] DB연결 - tweet 올리기 (0) | 2022.07.14 |