Mini Project

올리브수
|2022. 10. 30. 16:02
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 에서 키파일을 관리하는 방법은 대표적으로 세가지로 구현할 수 있다고 한다.
    1. Inline Configuration
    2. Configuration from a .py File
    3. 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

 

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