728x90
JWT?
JWT(JSON Web Token)
- 유저를 인증하고 식별하기 위한 토큰 기반 인증
- 이미 서명된 토큰!!
- 민감한 정보를 담지 않는다!!
- 누구나 디코딩을 한다면 해당 정보를 볼 수 있기 때문!
- (https://jwt.io/) 해당 사이트에서 암호화 알고리즘을 통해 디코딩을 제공해준다!
- 공개키 / 개인키 방식으로 → 안전하게 인증 과정 수행가능
- 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함된다.
- JWT는 별도의 인증 과정 없이 헤더에 포함되어 있는 JWT 정보를 통해 인증한다.
- 서버에 키가 있어야 수정할 수 있다.
각각의 정보에 대한 걸 해시와 같은 암호화 알고리즘을 적용하여 저장한다.
Cookie
- 로그인 시, id, pw를 쿠키에 저장하고 서비스 이용시 인증이 필요할 때는 쿠키에서 값을 꺼내와서 서버와의 인증 과정을 수행한다.
- id, pw 가 그대로 드러나서 보안 취약점이 발생한다.
Session
- cookie의 발전된 형태
- 인증 정보 자체에 대한 세션 id값을 db에 저장하고 이 값을 쿠키에 담아, 클라이언트가 쿠키를 요청할 때마다 db에 있는 정보와 동일한 지 확인한다.
- “세션 ID가 탈취되었을 경우 대처가 가능하다?” : 세션 id 자체는 정보를 담고 있지, 않아서 털려도 상관이 없다.
- But, 털리면 다시 갱신해준다.
- stateful 하다
- 서버에 상태를 저장해야한다.
- 물리적인 db자체에 데이터(id, 만료 시간 등)를 저장하고 불러오는 번거로움이 존재한다.
- scale out이 어렵다.
- (https://brunch.co.kr/@jinyoungchoi95/1)
- DB 로직이 한 번 수행된다는 점이 가장 큰 단점!
Reference
🎨 삽질 로그
⚠️ 문제 1. 공통 작업용 DB 관리
- Flask 에서 키파일을 관리하는 방법은 대표적으로 세가지로 구현할 수 있다고 한다.
- Inline Configuration
- Configuration from a .py File
- Configuring Flask From Class Objects
그 중에서 해당 프로젝트에서는 config 파일로 관리해주는 2번 방법을 활용해서 키 파일을 관리해줬다.
python-dotenv 를 이용해서 .env 파일 내의 키를 뽑아오도록 구현을 해줬다.
app.py
...
config = dotenv_values(".env")
client = MongoClient(config['HOST'],
username=config['USERNAME'],
password=config['PASSWORD'])
...
.env
HOST = "host_address"
USERNAME = "test"
PASSWORD = "test"
- flask에서 디버깅 모드로 [app.py](http://app.py) 실행하는 방법
- app을 재시작하지 않아도 된다.
- flask --app [app.py](http://app.py/) --debug run
⚠️ 문제 2. DB 데이터 분할 응답
이렇게 사이드 바를 구성하면서 참여자로 참여중인 모임 정보, 호스트로 참여중인 모임 정보에 대해 데이터를 나눠서 뿌려줘야될 필요가 있었다.
{
"host": "dlsgk", // 호스트 아이디
"title": "역전우동먹을사람? ",
"store": "역전우동",
"category": "일식",
"menu": "우동",
"time": "14:37",
"place": "연수동 앞",
"people": "3",
"state": "1",
"participant": [ // 현재 모임에 참여중인 참여자 정보
"dlsgk",
"test",
"olive"
],
"create": {
"$date": {
"$numberLong": "1666863293087"
}
}
}
app.py
partys, host_party, participant_party = [], [], []
if uid == False :
return redirect('/')
result = list(db.party.find({}).sort('time')) # 데이터 모두 추출
for data in result:
if uid == data['host']: # 현재 접속해 있는 계정이 호스트일 경우, 내가 만든 모임 리스트 초기화 및 생성
h_participants = [] #
host_party.append(data)
for participant_id in data['participant']:
participant = db.user.find_one({'id': participant_id})
h_participants.append(participant)
host_party[-1]['participant'] = h_participants
elif uid in data['participant']:
p_participants = []
participant_party.append(data)
for participant_id in data['participant']:
participant = db.user.find_one({'id': participant_id})
p_participants.append(participant)
participant_party[-1]['participant'] = p_participants
elif data['state'] == '0':
partys.append(data)
return render_template('home.html', partys = partys, host_party = host_party, participant_party = participant_party
1. if uid == data[’host’] : 내가 만든 모임일 경우
- 내가 만든 모임에 참여중인 참여자들 리스트는 h_participants 리스트에 담아서 뿌려줬다.
- 이때, 우리가 구현하려는 서비스의 경우 모임이 확정되기 전까지 참여자의 정보를 알 수 없도록(서비스 재미 요소) 하기 위해 닉네임만 뿌려주기로 했으므로 user DB에서 id 값을 토대로 user 정보를 찾아왔고 원하는 정보를 jinja2 를 사용해서 클라이언트 단에서 뿌려줬다.
2. elif uid == data[’participant’] : 참여자로 참여중인 모임일 경우
- ‘내가 만든 모임일 경우’ 의 로직과 동일하게 구성했다.
🔗 Reference
- python-dotenv · PyPI
728x90
'🌱 Dev Diary > 📄 TIL' 카테고리의 다른 글
알고리즘 이론 - 스택 (0) | 2022.11.05 |
---|---|
Week01 TEST (0) | 2022.11.05 |
알고리즘 이론 - 정렬 (1) | 2022.11.03 |
알고리즘 이론 - 재귀 (0) | 2022.11.03 |
파이썬 알고리즘 기초 점검 / 정리 (0) | 2022.10.30 |