본문 바로가기

BackEnd/백엔드

[백엔드] Flask: JWT 인증이란/구성요소/인증절차

반응형

JWT 인증

  • Json Web Tokens 
  • 두 개체에서 Json 객체를 사용하여 가볍고 정보를 안전성 있게 전달하는 방식
  • 권한 부여(로그인, 서비스 작성/수정/삭제 등), 정보 교환(유저가 누구인지 확인)
  • 암호화는 JWT 라이브러리가 해준다. 암호화 하고, 다시 되돌릴수 있는 걸 양방향 암호화라고 한다. JWT은 양방향 암호화이다.

 참고: https://jwt.io/


JWT의 구성 요소

header.payload.signature
  • header: 암호화 방식과 타입을 나타냄
  • payload:  전송할 데이터가 담김(유저 정보, 상품 정보 등)
  • signature:  토큰 검증을 위한 서명 

-> 데이터가 인코딩 되어있긴 하지만, 누구나 디코딩을 할 수 있어서, 데이터 유출에 대한 피해가 있을 수 있다. 그러나 헤더와 페이로드를 통해 서명필드는 만들어지기 때문에 데이터 변조 후 재전송하는 것을 막을 수 있다. 

 


JWT 인증 절차

  • 사용자가 id와 password를 입력하여 로그인을 시도
  • 서버는 요청을 확인하고 secret key를 통해 Access token을 발급
  • 인증 이후 사용자가 API를 요청할 때 Authorization header에 Access token을 담아서 요청
  • 서버는 JWT Signature를 체크하고 payload로부터 user정보를 확인하고 원하는 자원을 Return

 

  • 사용자가 보호된 경로 또는 리소스에 엑세스 하려고 할 때마다, 클라는 Bearer 스키마를 사용하여 Authorization 헤어데어 JWT를 보내야한다. 

  • Bearer는 JWT 혹은 OAuth에 대한 토큰을 사용한다는 인증타입이다.(토큰 포맷 중 하나)

 

간략하게:

- 회원가입/로그인시 토큰 발행

- 발행된 토큰을 클라이언트에서 저장하고

- 이를 인증 필요한 api호출에 사용한다. 

 

  • 세상에 있는 모든 서비스는 인증 토큰을 이용해서 인증을 한다.
  • 회원가입을 한다. 서버는 DB(user 테이블)랑 연결이 되어있다.
  • 닉네임/이메일/비번을 형식에 맞추어 서버에 제공했을 경우 비밀번호를 암호화 하고 DB에 저장한다. 
  • DB는 저장한 user_id를 암호화 한다. 그래서 이상한 문자열을 클라로 보낼것이다. 암호화된 토큰/문자열을 클라이언트한테 준다. 
  • 클라는 웹/앱에 저장시킨다. (서버에 요청할 때마다 계속 보내야해서, 저장해놓는다.)
  • 유저가 레시피 생성 API를 호출할 때, 회원가입/로그인 할 때 암호화된 토큰을 서버로 같이 보내준다.
  • 이 토큰은 body에 Json형식으로 보내는 게 아니라, header로 보낸다. 

 

(postman의 header 위치)

  • body에는 데이터, header은 토큰을 입력하고 서버에 요청하면, 서버에 있는 데이터가 동작하면서, DB에서 데이터를 가져온다. 
  • 한번 회원가입/로그인 할 때만, 인증토큰이 작동되면 다시 인증할 필요가 없다. 인증토큰은 회원가입/로그인 할 때만 받아온다. 

로그아웃 할 때 두 가지 방법이 있는 데: 

  • 내 스스로 로그아웃 버튼을 누르는 방법
  • 일정시간이 지나면 로그아웃 되는 방법. 

- 시간을 셋팅이 가능하다. 특정시간이 지나면, 로그인이 안된다는 뜻은. 해당 토큰을 발행할 때, 유효시간 1시간 짜리로 만들었다면, 1시간이 지난후에 API를 요청할 경우 JWT가 토큰 유효 여부를 확인 후에 에러코드를 보내준다: invalid token. 

- 그럼 클라는 ‘로그아웃 되었습니다. 다시 보내주세요”라고 창을 띄워준다. 

ㄴ 이것이 인증키다. 

 

  • JWT는 파이썬 뿐만 아니라, 자바, HTTP등에서도 사용된다. 

 

반응형