처음 회원가입을 하는 과정에서는 입력받은 비밀번호등 개인정보들을 해싱하여 보관하는데 이때 실습간에는 bcrypt 라이브러리를 사용해서 이과정을 간단하게 사용할수 있었다.
django로 실습하는 중에 로그인 기능을 구현하면서 JWT를 사용하게 되었다 정확히 무엇이고 어떤이유로 사용하게 되는지 궁금해져서 찾아보게 되었다.
먼저 JWT 는 JSON Web Token의 약자로 전자 서명 된 URL-safe (URL로 이용할 수있는 문자 만 구성된)의 JSON이다.
JWT는 서버와 클라이언트 간 정보를 주고 받을 때 Http 리퀘스트 헤더에 JSON 토큰을 넣은 후 서버는 별도의 인증 과정없이 헤더에 포함되어 있는 JWT 정보를 통해 인증하게 된다.
로그인 과정을 간략히 생각해보면 데이터 베이스에 저장된 사용자 계정의 해시값 등을 꺼내온다음 사용자의 암호를 알고리즘으로 계산한 값과 일치하는지 확인하는 과정을 거쳐 하기 때문에 매번하면 시간과 리소스 낭비가 심하고 또한 중간에 아이디와 비밀번호가 데이터화되어 교환하는 횟수가 늘어나면 해킹으로부터 불리하다.
쿠키와 세션의 차이점
저장위치 : 쿠키는 로컬에, 세션은 로컬과 서버에 저장됩니다.
보안 :쿠키는 탈취와 변조가 가능하지만, 세션은 ID값만 가지고 있고 서버에도 저장이 되어있기 때문에 상대적으로 안전합니다.
Lifecycle :쿠키는 브라우저를 종료해도 파일로 남아있지만, 세션은 브라우저 종료시 세션을 삭제합니다
속도 :쿠키는 파일에서 읽기 때문에 상대적으로 빠르고, 세션은 요청마다 서버에서 처리를 해야하기 때문에 비교적 느립니다.
세션 statefull : 브라우저가 종료되기 전까지 클라이언트의 요청을 유지하게 해주는 기술
인증하고 나면 인증완료된 토큰을 사용자의 브라우저에서 쿠키로 저장하고 , 서버의 메모리 경우에따라서는 하드나 데이터베이스가 보관함
세션은 statefull 하기때문에 구현시에 고려사항이 많지만 기억하는 대상의 상태를 언제든 제어할수있음
(ex 동시접속 없이 한 기계에서만 접속하는 서비스를 만들경우 동시접속을 시도하면 기존에 접속되어있던 유저의 세션을 폐기하거나 상태를 로그아웃으로 변경가능)
단점 트레픽이 몰리면 메모리가 부족하게 되고 서버에 부하가 발생 서버를 restart하면 기존에 가지고있던 로그인 정보가 모두 휘발하게됨 서버를 여러개로 분산하게되면 새션유지가 안됨 이를 하드나 데이터베이스에 보관하면 속도가 저하됨
새션-쿠키의 단점을 보안하기 위해 나온것이 JWT 시간에 따라 바뀌는 어떤 상태값을 안갖는 stateless 특징
encoding 또는 암호화된 3가지 정보를 포함하고있음 header.payload.verify signature로 구분됨
JWT는 인가를 위해 사용되고 헤더와 페이로드는 암호화 되어있지 않고 다만 인코딩만 되어있어 디코딩하면 어떤 값이 쓰여있는지 알수있다 해서 헤더와 페이로드에는 개인정보등과 같이 밖으로 유출되어서는 안되는 값들은 포함되선 안되며 유저의 ID등도 DBTABLE 내의 PK키로 표현하는 방식으로 외부에서 유출되어도 상관없도록 해서 포함한다.
1.header
type = JWT 고정값, alg=3번의 서명값을 만드는데 사용될 알고리즘
2.payload 여러 정보들이 담김 발행일 유효날짜 서비스가 사용자에게 이 토큰으로 공개하길 원하는 내용 (ex 사용자의 닉네임, 서비스상의 레벨, 관리자 여부등) 이렇게 토큰에 담긴 사용자 정보들을 claim 이라고 함
3.verify signature
헤더,페이로드,서버에 감춰둔 비밀값 3가지를 알고리즘으로 encoding 하여 3번의 서명값이 생김 서버는 요청이 토큰과 함께 오면 받은 JWT의 1,2번 값과 서버의 비밀값 을 알고리즘으로 계산해보고 이 결과값이 해당토큰과 같은지 확인함
JSON의 장점
사용자 인증에 필요한 모든 정보는 토큰 자체에 포함하기 때문에 별도의 인증 저장소가 필요없다
분산 마이크로 서비스 환경에서 중앙 집중식 인증 서버와 데이터베이스에 의존하지 않는 쉬운 인증 및 인가 방법
트레픽에 대한 부담이 낮음 REST 서비스로 제공 가능
JSON의 단점
비상태 애플리케이션에서 토큰은 거의 모든 요청에 대해 전송되므로 데이터 트래픽 크기에 영향을 미칠 수 있습니다.
이미 발급된 토큰을 임의로 파기시키거나 서버가 추적하고있는 것이아니기 떄문에 통제할수 없음 즉 데이버데이스에서 사용자 정보를 조작하더라도 토큰에 직접 적용이 불가능 토큰이 해커에게 탈취됐을 경우 무효화 할수도 없음
이를 해결하기위해 토큰을 두개 발급해줌 토큰의 발급시간을 짧게 몇시간 또는 몇분이하로 해서 주느 access 토큰과 보통 2주정도로 길게 refresh 토큰을 발급 refresh 토큰의 상응값을 DB에도 저장 유저가 acess토큰의 수명이 다하면 refresh 토큰을 보내고 이걸 db저장되어있던 값과 대조해보고 맞다면 새 acess 토큰을 발급 중간에 acess 토큰이 해킹당해도 접속 허용시간이 짧고 db에서 해 refresh 데이터를 지워버리면 토큰갱신이 안되도록 막아 제어할수있음
'First step > web depeloper step1' 카테고리의 다른 글
관계형 데이터 모델링 (0) | 2021.11.28 |
---|---|
decorator 를 이해해보자 (0) | 2021.11.28 |
입문할때 어려웠던점 - 개발 환경 셋팅 (0) | 2021.11.23 |
[django]JSON은 뭘까? (0) | 2021.11.23 |
django _ORM은 뭘까 , 정규화는 뭘까 (0) | 2021.11.21 |