인터넷을 이용할 때 나에게 기록되는 것, 내꺼에 남는 것
내 컴퓨터의 브라우저에 저장되는 내용들
불안한 요소가 많다. 해킹의 위험도 높다.
따라서 조작되거나 가로채여도 큰 일은 없을 수준의 정보들을 브라우저에 저장하는데 사용한다.
쿠키로 저장하기에 곤란한 정보들은 세션에 저장한다.
세션은 임시 키를 브라우저에 보내고 사용자는 쿠키로 저장한다.
사용자의 중요한 정보는 서버의 메모리나 데이터베이스에 저장
브라우저가 접속할 때 마다 http 요청에 키를 실어 전송하고
서버는 그 키를 보고 응답으로 보내줌(브라우저로)
사용자나 다른 누군가에게 노출되어서 안되는 서비스 제공자가 직접 관리해야 되는내용은 세션으로 서버 안에서 다뤄진다.
웹 개발자들은 사이트를 만들 때 쿠키와 세션에 각각 어떤 정보들이 저장될지 적절한 판단을 내릴 수 있어야 한다.
쿠키로 노출시켜선 안 될 정보들이 있고, 세션을 남발하면 서버에 부하가 많이 걸리기 때문에
가져오는데 비용이 드는 데이터를 임시 저장하는 곳
메모리나 안드로이드등 다양한 곳에서 사용한다.
웹 캐시는 이미지등의 정보를 가져올 때 데이터 사용량, 시간이 들기 때문에
사용자가 여러번 방문할 법한 사이트는 한 번 받아온 데이터를 사용자의 컴퓨터나
중간 역할을 하는 서버에 임시로 저장해둔다.
웹 페이지에 로그인을 할 때 서버에선 내가 로그인을 하고 있다는 사실을 알고 있어야한다.
인증 Authentication
내가 이 사이트에 가입된 회원임을, 즉 특정 서비스에 일정 권한이 주어진 사용자임을 아이디와 패스워드를 통해 인증을 받는 것
인가 Authorization(권한부여)
인증을 받은 사용자가 이후 서비스 기능들을 사용할 때. 서비스 제공자가 (인증을 통해)이를 알아보고 기능을 사용할 수 있게 허가를 해주는 것
세션
반은 사용자에게 반은 서버의 메모리에 저장. 경우에 따라 서버의 하드나 데이터베이스에 저장.
브라우저는 이 반을 Session ID란 이름의 쿠키로 저장하고 사이트에 요청을 보낼 때마다 이 Session ID를 실어보낸다.
요청이 오면 메모리에서 맞는 짝이 있는지 확인 후 맞으면 권한을 준다.
이처럼 Session ID를 사용해서 어떤 사용자가 서버에 로그인이 되어있음이 지속되는 이 상태를 세션이라고 한다.
단점 - 서비스에 동시 다발적으로 접속할 경우 메모리가 부족, 이 메모리는 휘발성이라 재부팅이 되어야하는 상황이 오면 메모리에 있는 것들은 다 날아가게 된다. > 로그인을 다시 해야됨
JWT(JSON Wep Token)
사용자가 로그인을 하면 토큰(Session ID같은)을 주지만 사용자에게만 준다.
인코딩 또는 암호화된 세 가지 데이터를 이어붙인 것으로 중간에 마침표가 두 군데 들어가있음.
각각 Header, payload, verify signature로 구분된다.
먼저 두번째 값인 payload는 이 토큰을 누가 누구에게 발급했는지, 언제까지 유효한지 등
서비스는 사용자에게 토큰을 통해 공개하기 원하는 내용을 서비스 측에서 원하는대로 담을 수 있다.
이렇게 토큰에 담긴 사용자 정보 등의 데이터를 Claim이라고 한다.
이를 사용자가 조작해서 사용하는 것을 방지하고자 1(Header),3(verify signatue) 파트가 있다.
Header에는 토큰의 타입 JWT(고정값), alg 두 가지 정보가 저장되어 있다.
alg에는 3번 서명 값을 만드는데 사용될 알고리즘이 저장된다.
(HS256 등 여러 암호화 방식 중 하나를 지정할 수 있다.)
1번 헤더와 2번 페이로드 그리고 서버에 감춰놓은 비밀 값 이 셋을 이 알고리즘에 넣고 돌리면 3번 서명 값이 나온다.
서버는 요청에 토큰 값이 들어오면 1,2번 값을 비밀 값과 함께 돌려봐서 계산된 결과값이 3번 서명 값과 일치하는 결과가 나오는지 확인한다.
2번의 정보가 서버가 아닌 누군가에게 조금이라도 조작되면 서버에서 거부한다.
서명값과 유효기간이 일치하면 사용자는 회원으로서 인가를 받게 되고 서비스 이용이 가능해진다.
결점 - 통제를 할 수 없다. 사용자의 토큰을 누군가 가져갈 경우 그 토큰을 무효화 할 방법이 없다.
두 개의 토큰을 주는대신 하나는 만료시간이 짧은 access 토큰, 하나는 만료시간이 긴 시간을 가지고 있는 refresh 토큰을 준다 이는 상응값을 데이터베이스에 저장한다.
access 토큰의 수명이 다 하면 refresh 토큰을 보내고 서버는 그걸 데이터베이스에 저장된 값과 대조해보고 맞다면 새 access 토큰을 발급해준다.
하지만 JWT는 결국 access 토큰이 살아있는 동안의 해킹 등에 대한 불안함은 완벽하게 없애진 못한다는 단점이 있다.
참고 사이트1 얄팍한 코딩사전 쿠키, 세션, 캐시가 뭔가요?
참고 사이트2 세션 VS 토큰! JWT가 뭔가요?