이번에는 인스타 클론코딩을 진행 하면서 아래와 같이 구현 했습니다.
✔️ JWT 구현
- access token 발급하기
- refresh token 발급하기
- 서버 내부 정책으로 refresh token 다루기
✔️ 토큰을 사용한 인증
- 게시물 작성 시 작성자가 자동으로 추가되도록 구현하기
- 게시물 작성 시 로그인 된 유저만 작성할 수 있도록 구현하기
- 게시물 수정 시 작성자만 게시물을 수정할 수 있도록 구현하기
+
✔️ 게시물 삭제 시 작성자만 게시물을 삭제할 수 있도록 구현하기
JWT ?
JSON Web Token
당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한
간결하고 자체 포함된 방법을 정의하는 개방형 표준( RFC 7519 )을 말합니다.
클라이언트와 서버 사이에서 통신할 때 권한을 위해 사용하는 토큰으로,
웹 상에서 정보를 Json형태로 주고 받기 위해 표준규약에 따라
생성한 암호화된 토큰으로 복잡하고 읽을 수 없는 string 형태로 저장되어있습니다.
구제적인 이해가 필요하시다면 참고해주세요.
[WEB] 📚 JWT 토큰 인증 이란? - 💯 이해하기 쉽게 정리
인증 방식 종류 (Cookie & Session & Token) 보통 서버가 클라이언트 인증을 확인하는 방식은 대표적으로 쿠키, 세션, 토큰 3가지 방식이 있다. JWT를 배우기 앞서 우선 쿠키와 세션의 통신 방식을 복습해
inpa.tistory.com
JWT 구성요소
JWT는 헤더(header), 페이로드(payload), 서명(signature)으로
세부분으로 나뉘어 각각 "." 으로 연결되어 있는 형태를 가지고 있습니다.
그리고 간단하게, 각 아래와 같은 정보가 들어있습니다.
헤더 (Header)
- 어떠한 알고리즘으로 암호화 할 것인지, 어떠한 토큰을 사용할 것 인지에 대한 정보가 들어있다.
정보 (Payload)
- 전달하려는 정보( 클레임 : 사용자 id나 다른 데이터들 )가 들어있다.
서명 (Signature)
- 가장 중요한 부분으로 헤더와 정보를 합친 후 발급해준 서버가 지정한 secret key로
암호화 시켜 토큰을 변조하기 어렵게 만들어준다.
JWT를 이용한 인증 과정
- 사용자가 ID, PW를 입력하여 서버에 로그인 인증을 요청한다.
- 서버에서 클라이언트로부터 인증 요청을 받으면, Header, PayLoad, Signature를 정의한다.
Hedaer, PayLoad, Signature를 각각 Base64로 한 번 더 암호화하여 JWT를 생성하고
이를 쿠키에 담아 클라이언트에게 발급한다. - 클라이언트는 서버로부터 받은 JWT를 로컬 스토리지에 저장한다. (쿠키나 다른 곳에 저장할 수도 있음)
API를 서버에 요청할때 Authorization header에 Access Token을 담아서 보낸다. - 서버가 할 일은 클라이언트가 Header에 담아서 보낸 JWT가 내 서버에서 발행한 토큰인지 일치 여부를 확인하여 일치한다면 인증을 통과시켜주고 아니라면 통과시키지 않으면 된다.
인증이 통과되었으므로 페이로드에 들어있는 유저의 정보들을 select해서 클라이언트에 돌려준다. - 클라이언트가 서버에 요청을 했는데, 만일 액세스 토큰의 시간이 만료되면 클라이언트는 리프래시 토큰을 이용해서
- 서버로부터 새로운 엑세스 토큰을 발급 받는다.
게시물 삭제 구현
위에 인증과정을 살펴보면 3번째 과정에서 API를 서버에 요청할때
Authorization header에 Access Token을 담아서 보내고 그것을 통해 인증하는 것을 알 수 있습니다.
이것을 이용해서,
게시물 작성 시 로그인 된 유저만 작성할 수 있도록,
그리고 게시물 수정 시 작성자만 게시물을 수정할 수 있도록 아래와 같이 구현해봤습니다.
33줄 - JWT 토큰 요청을 보낸 username을 알아냄
34줄 - 알아낸 username을 가진 유저id를 알아냄
37줄 - 게시물이 있는지 확인
41줄 - 작성자id와 요청을 보낸 유저id가 같은지 확인
42줄 - 같다면 수정을 함
44줄 - 다르다면 수정하지 않음
여기서 게시물 삭제하는 경우도 추가해보겠습니다.
게시물을 수정 할때와 동일하게 삭제 할때에도 작성자만 게시물을 삭제할 수 있도록 해야합니다.
그 말은, 수정 할때와 코드가 동일하다는 것을 의미합니다.
이제 실제로 "supsup" 이라는 작성자가 작성한 게시물을 삭제해 보도록 하겠습니다.
작성자가 아닐 때 (올바른 Access Token을 담지 않았을 때)
작성자가 맞을 때 (올바른 Access Token을 담았을 때)
잘 동작하는 것을 확인 할 수 있습니다.
Reference Path
[REAL Python – Flask] – “인스타그램 클론코딩 – Instagram Clone (4)” - Gdsanadev_
그래서, JWT가 대체 뭔데? JWT란 과연 무엇일까요? 그것은 오늘 구현할 것이기도 하고, 로그인을 위해서 사용할 것이기도 합니다. 대체 JWT가 뭐길래, 로그인을 그렇게 구현하려고 하는 걸까요? 이
gdsanadev.com
[WEB] 📚 JWT 토큰 인증 이란? - 💯 이해하기 쉽게 정리
인증 방식 종류 (Cookie & Session & Token) 보통 서버가 클라이언트 인증을 확인하는 방식은 대표적으로 쿠키, 세션, 토큰 3가지 방식이 있다. JWT를 배우기 앞서 우선 쿠키와 세션의 통신 방식을 복습해
inpa.tistory.com
'flask' 카테고리의 다른 글
werkzeug 의 정규표현식 (0) | 2022.11.16 |
---|---|
WSGI와 Werkzeug (0) | 2022.11.16 |
flask clone coding [2] (데이터 검증) (0) | 2022.11.13 |
flask clone coding [1] (Flask-SQLAlchemy 3.0 변경사항) (0) | 2022.11.06 |
CORS란? 그리고 해결방법은? / CSR vs SSR (0) | 2022.11.02 |