반응형
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로 보낸다.
- body에는 데이터, header은 토큰을 입력하고 서버에 요청하면, 서버에 있는 데이터가 동작하면서, DB에서 데이터를 가져온다.
- 한번 회원가입/로그인 할 때만, 인증토큰이 작동되면 다시 인증할 필요가 없다. 인증토큰은 회원가입/로그인 할 때만 받아온다.
로그아웃 할 때 두 가지 방법이 있는 데:
- 내 스스로 로그아웃 버튼을 누르는 방법
- 일정시간이 지나면 로그아웃 되는 방법.
- 시간을 셋팅이 가능하다. 특정시간이 지나면, 로그인이 안된다는 뜻은. 해당 토큰을 발행할 때, 유효시간 1시간 짜리로 만들었다면, 1시간이 지난후에 API를 요청할 경우 JWT가 토큰 유효 여부를 확인 후에 에러코드를 보내준다: invalid token.
- 그럼 클라는 ‘로그아웃 되었습니다. 다시 보내주세요”라고 창을 띄워준다.
ㄴ 이것이 인증키다.
- JWT는 파이썬 뿐만 아니라, 자바, HTTP등에서도 사용된다.
반응형
'BackEnd > 백엔드' 카테고리의 다른 글
MongoDB 버젼 cmd(명령 프롬프트에서) 확인 방법 (0) | 2022.11.25 |
---|---|
[POSTMAN]지금까지 작성한 API 문서 = API 명세서로 확인 (0) | 2022.07.01 |
코드 프레임 워크 가져오기 / 단위테스트(Unit test) (0) | 2022.07.01 |
[백엔드] Postman 설치: API 테스트 프로그램/툴 (0) | 2022.06.21 |
요청(Request): Headers/ body, 응답(Respond): HTTP 상태코드 (0) | 2022.06.21 |