일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 파이썬
- 채팅
- SAA
- node
- 카톡
- crud
- async
- merge
- wetube
- MongoDB
- EC2
- socket io
- Class
- Vue
- SSA
- dict
- RDS
- docker
- flask
- react
- 튜플
- AWS
- TypeScript
- NeXT
- S3
- Props
- git
- 중급파이썬
- lambda
- pandas
- Today
- Total
초보 개발자
로그인 구현 jwt 본문
로그인을 한번 해보자.
로그인 버튼을 누르면 api/login으로 data를가지고 POST요청을 보낸다.
ID와 PW를 가져온 뒤 pw는 다시 해쉬화를 시킨 후 db속에 일치하는 데이터가 존재하면 result로 담아온다.
만약 존재하지 않는다면 else문으로 빠져 '아이디/비밀번호가 일치하지 않습니다.'라는 메시지를 보낸다.
이제 JWT토큰을 만들어 웹 페이지에게 보내는 작업을 시작한다. payload 부분에는 토큰에 담을 정보가 들어있다. 여기에 담는 정보의 한 ‘조각’ 을 클레임(claim) 이라고 부르고, 이는 name / value 의 한 쌍으로 이뤄져있다. 토큰에는 여러개의 클레임 들을 넣을 수 있다. 그 중에 exp(만료시간)와 같은 특정기능을 수행하는 클레임 같은경우는 꼭 이름을 지켜주어야 한다. id에는 로그인 한 id의 값을, exp는 5초뒤의 시간을 넣어주었다.
원래라면 header.payload.signiture이 세부분을 또 base64로 인코딩하고 해쉬까지 해줘야 하는 복잡한 절차를 거쳐야 하지만 파이썬에서는, Pyjwt로 쉽고 간편하게 jwt를 만들고 검증할 수 있다.
첫 번째 인자로는 payload를 넣어 원하는 데이터를 넣고, 두번째는 secret_key를, 3번째에는 어떤 해쉬알고리즘을 쓰는 건지 정해준다. jwt.encode 함수는 결과값으로 jwt 토큰, 즉 암호화된 Header.Payload.Signature 형태의 string을 반환해준다!!!!
이렇게 만든 토큰을 json으로 보내면 웹에서는 이를 받고 처리를 한다.
jquery를 사용하면 $.cookie를 통해서 쿠키를 만들어 저장할 수 있다. 여기선 mytoken이라는 이름으로 받아온 jwt토큰을 저장하고 '로그인 완료!'라는 alert를 띄우고 /로 redirect해줬다. 만약 토큰이 제대로 발급이 안되었다면 다른 alert를 띄울 것이다.
이러한 토큰이 생성이 되었다. 다시 이걸 디코드 해주어야 우리가 활용할 수 있을 것이다.
decode도 encode와 마찬가지 패턴을 사용한다. payload자리에 token을 넣어주기만 하면 된다.
decode한 내용은 아래와 같다.
이걸 토대로 다시 db에서 관련 정보를 찾을 수 있을 것이다. 근데 여기서 만약 id값을 안줬다고 가정해보자 그럼 우리가 토큰을 가지고 있더라도 db에 접근할 수 가 없을 것이다. (정보가 있어야 db에서 뭘 찾든가 하지)
payload에 있는 id와 db에 일치하는 id를 찾아 가져온 뒤 index.html을 렌더링 해주고 nickname도 같이 전달해주었다.
index.html
nickname이 잘 출력이 되는 걸 확인할 수 있다.
이렇게 5초가 지나면 우리가 jwt토큰에 설정한 만료기간이 지나서 새로고침을 해보면
이러한 메시지가 출력이 된다.
그렇다고 해서 쿠키에 jwt가 사라진 것은 아니다. 남아 있지만 토큰 권한을 상실한 것 같다.
만료된 토큰을 넣어서 decode를 진행하면 아래와 같은 에러가 나타난다.
jwt.exceptions.ExpiredSignatureError: Signature has expired
따라서 아래의 분기문에 걸려서
시간이 만료되었다고 뜨는 것이다.
따라서 자동으로 사라지도록 만들고 싶은데 http 헤더에 쿠키를 삭제하는 걸 넣을 수가 없다나..??
로그아웃 버튼을 누르면 웹페이지상에서 mytoken이라는 쿠키를 삭제하도록 해주었다!!
'AI 웹개발 트랙 - 내배캠 > 3주차' 카테고리의 다른 글
3주차 WIL + 1차 프로젝트 (0) | 2022.01.01 |
---|---|
flask 이미지 업로드 방식 1 static에 집어넣기 (0) | 2021.12.30 |
회원가입 구현 hashlib (0) | 2021.12.28 |
파이썬 머지병합 and 머지정렬 (0) | 2021.12.27 |
파이썬 버블정렬, 선택정렬, 삽입정렬 (0) | 2021.12.27 |