처음 django shell을 알게되었을때 멘토님이 하셨던 말이 있다.
"1차 프로젝트는 잘 했어도 정작 shell 을 못다루는 경우도 있었어요"
당시엔 이해가 안됐다... 'shell 이 얼마나 다루기 편한데 이걸 안하고 더 복잡해보이는 views.py를 많이 다뤘다고??'
처음 db를 shell을 통해 다룰땐 이게 제일 쉬운줄(??) 알았다. 근데왠걸?! 어느새 views.py 에서만 놀고있는 나를 발견했다!
흐름에 따라 하나씩 입력해 주어야 한다.
views.py 에서는 일단 다~ 입력해놓고 위치수정이 가능하다. 그런데 shell에서는 순서에 맞게 입력해줘야 한다.. 이런거에서 귀찮음을 느꼈던것 같다.
그래도 shell을 이용하면 작동하는 방식을 하나씩 뜯어볼수 있으니까! shell.. 이용.. 필수.. 메모..
기존에 작성해두었던 posting app의 model을 사용했다.
pk 30번은
id : 30
email : yes@gmail.com
name : yes
이고 password는 생성 당시 암호화 되어 decode 상태로 저장되어있다. (str) (CharField)
사용할 instance를 불러온 후 토큰발행에 필요한 jwt를 import 해준다.
+) bcrypt는 지금은 필요없다.. 이미 암호화 된 형태의 password가 db 에 저장되어있기 때문!! 위에서 pwd='111'로 확인하는 과정이 있었는데 그 코드가 끼어들어가있다.
jwt에서는 반드시 JSON 객체만 사용해야 한다. 때문에 b.id 라고 하는 것이 아니라 key, value 형태로 작성해 주어야 한다.
JWT의 형태를 다시 살펴보면 다음과 같다.
여기서 header와 payload는 암호화가 아닌 단순 인코딩된 상태 이므로 얼마든지 제 3자가 decoding 하여 정보를 알아낼수 있다. 때문에 절대 개인정보를 담지 않는다. 위에서는 id 값만 넣어주었다.! 이 경우 db에 접근 권한이 없을 때 id 만 안다고 해서 다른 정보를 알 수가 없기 때문에 id 값을 사용한 것이다.
로그인 한 user에게 발급된 토큰은 로그인 한 유저가 다른 활동을 하는데 일종의 증명서 역활처럼 행동한다. 해당 토큰이 유효한 기간동안 인증절차를 걸쳐 다른 행동이 가능하기 때문이다.
( 로그인 한 유저만 게시글 작성 가능 등...)
이런 과정에 있어서 전달받은 토큰으로부터 어떤 유저인지 알 수 있어야 한다. 아래 코드가 그걸 알아내는 과정이다.
pyjwt v 2.0.0 이상에서 decode사용 시 encode 때 "algorithm"이라 작성한 것과 달리 "algorithms"라고 작성해야 한다!!!
위에서 JSON 객체로 작성된 형태 그대로 {'user_id':30} 이 확인됨을 볼 수 있다.
이때 type은 dictionary이다.
위 과정을 해본 이유는 내 views.py 로직이 엉망이었기 때문이다... 정리하는 겸, 다시 shell을 이용하는 습관을 기를 겸 수행해 보았다.