[general] ⭐️인증과 인가

cho yunsu·2021년 9월 24일
0

쿠키와 세션 ? http의 connectionless, stateless의 단점을 극복하기 위한 것. 즉 state를 기억하기 위한 것. 만약 쿠키와 세션이 없다면 로그인하고 페이지가 옮길떄마다 계속 로그인 해야할 것..

쿠키란? 브라우저에 저장되는 키와 값으로 이루어진 작은 데이터 파일..
쿠키는 사용자가 요청하지 않아도 서버에서 header에 넣어서 응답함.

세션이란? 사용자정보파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버에서 관리함. 서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지합니다.

쿠키와 세션의 공통점 & 차이점
쿠키와 세션은 비슷한 역할을 하며, 동작원리도 비슷합니다. 그 이유는 세션도 결국 쿠키를 사용하기 때문입니다.
가장 큰 차이점은 사용자의 정보가 저장되는 위치입니다. 때문에 쿠키는 서버의 자원을 전혀 사용하지 않으며, 세션은 서버의 자원을 사용합니다.

(참고) 캐시란? 서버에 재요청하지 않기 위해 css,js를 브라우저에 저장하는 것. 쿠키와 세션과는 다른 기능..


Q. JWT ? 인가와 관련된 기술.
인증(Authentication) : 쉽게 말해서 로그인.
인가(Authorization) : 한번 인증을 받은 사용자가 이후 서비스의 여러기능을 사용할 때, "서버"가 내가 로그인되었음을 확인하고 허가해주는 것. 한마디로 로그인 유지.

(중요!) 어떤 사이트에 사용자가 로그인해있다는 사실을 서버가 인지할 수 있는 방법 ?
1. 전통적인 "세션"방식(stateful) : 사용자가 로그인 성공하면, 서버는 세션표딱지 발행. 반쪽은 브라우저로 보내고(세션id) 반쪽은 서버가 관리.
세션id를 사용해서 어떤 사용자가 로그인이 지속된 상태를 "세션"이라고 함. 요점은 서버가 어떤 "상태"를 "기억"해야하는 부담.. 메모리에 기억하면 서버재시작하면 상태정보 날라감. 데이터베이스에 저장하면 느림.

서버 부담없이 인가구현하기 위해 만든 것이 JWT. JWT방식에서는 사용자가 로그인을 하면 표를 출력하여 주는데 반쪽만 주는 것이 아니라 그냥 다 줌. 즉 서버가 기억하지 않음. 헤더+페이로드+서명으로 구성. stateless. 서버는 받은 요청을 계산하여 서명값 일치여부만 확인.
access token: 수명이 아주 짧은 토큰.
** refresh토큰: 엑세스토큰을 재발행받기 위한 토큰.


쿠키 vs 세션 vs 토큰 vs JWT

  1. 쿠키 : 쿠키와 토큰? 이런 질문 자체가 잘못됐다.
    how a server put data on the "browser" to remember something about you.. 도메인마다 보내진다(구글쿠키는 구글에게만). 인증정보 뿐 아니라 여러가지 정보 저장 가능!!
    즉, "쿠키는 정보전달매개체 in 브라우저"

  2. 세션 : 서버가 사용자를 기억하기 위해 고안된 개념으로 아이디 비번이 맞다면 sessionDB에 사용자 정보를 생성하고 sessionID를 브라우저에 발급한다. 그리고 이 세션id가 쿠키(정보전달매체)로 저장된다. 서버는 세션id를 받고 세션db를 뒤져 사용자가 누군지 알아낸다. 유저는 세션id만 갖고 있고 사용자 정보는 서버측에 있다.

  3. 토큰 : 네이티브앱에서는 쿠키를 못쓴다. 쿠키는 브라우저에만 존재하니까... 이런 맥락에서는 토큰이라고 한다. 토큰인 이상하게 생긴 string..!!
    즉, "서버가 기억하는 이상하게 생긴 string"

  4. JWT : 세션방식은 db리소스 사용이 크다.. JWT의 등장.. 서버는 아이디와 비번이 맞으면 사인된 토큰을 사용자에게 주고(세션id처럼).. 사용자는 사인된 토큰을 매 요청모다 실어 보내고 서버는 유효성체크만 한다. 세션id와 차이점은 jwt 토큰에서는 그 자체에 정보를 담고 있다.
    즉, "스스로 정보를 가지고 있는 토큰"

세션방식은 모든 유저의 정보를 저장(세션db)하기 때문에 통제권을 준다. 이는 비용이 든다.

profile
Growing Developer!!

0개의 댓글