이번에는 인스타 클론코딩을 진행 하면서 아래와 같이 구현 했습니다.
✔️ JWT 구현
- access token 발급하기
- refresh token 발급하기
- 서버 내부 정책으로 refresh token 다루기
✔️ 토큰을 사용한 인증
- 게시물 작성 시 작성자가 자동으로 추가되도록 구현하기
- 게시물 작성 시 로그인 된 유저만 작성할 수 있도록 구현하기
- 게시물 수정 시 작성자만 게시물을 수정할 수 있도록 구현하기
+
✔️ 게시물 삭제 시 작성자만 게시물을 삭제할 수 있도록 구현하기
JWT ?
JSON Web Token
당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한
간결하고 자체 포함된 방법을 정의하는 개방형 표준( RFC 7519 )을 말합니다.
클라이언트와 서버 사이에서 통신할 때 권한을 위해 사용하는 토큰으로,
웹 상에서 정보를 Json형태로 주고 받기 위해 표준규약에 따라
생성한 암호화된 토큰으로 복잡하고 읽을 수 없는 string 형태로 저장되어있습니다.
구제적인 이해가 필요하시다면 참고해주세요.
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
'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 |