
Session은 일정 시간 동안 같은 사용자로부터 들어오는 요구를 하나의 상태로 보고 그 상태를 일정하게 유지시키는 기술이다.
여기서 일정 시간이란 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점부터 웹 브라우저를 종료함으로써 연결을 끝내는 시점을 말한다
💡 즉, 유저가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 세션이라고 말한다.기존에 주로 사용하는 서버 기반의 인증 방식으로 서버 측에서 사용자들의 정보를 기억하고 있어야 한다.
사용자들의 정보를 기억하기 위해서는 세션을 유지해야 하는데 메모리나 디스크 또는 데이터베이스 등을 통해 관리한다.
서버 기반의 인증 시스템은 client로 부터 요청을 받으면 client의 상태를 계속해서 유지하고 이 정보를 서비스에 이용하는데 이러한 서버를 stateful한 서버라고 한다.
예를 들어, 사용자가 로그인을 하면 세션에 정보를 저장해두고 서비스를 제공할 때 사용하게 된다.
사용자의 정보는 세션 저장소에 저장되고 , 쿠키는 그 저장소를 통과할 수 있는 츨입증 역할을 한다. 따라서 쿠키가 담긴 HTTP요청이 도중에 노출되더라도 쿠키 자체에는 유의미한 값을 갖고 있지 않아서 쿠키에 사용자 정보를 담아 인증을 거치는 것 보다 안전하다.
각각의 사용자는 고유의 세션 ID를 발급받기 때문에 일일이 회원 정보를 확인할 필요가 없어서 서버 자원에 접근하기 용이하다.
→ 하지만, 만약 해커가 사용자 A의 HTTP 요청을 훔처서 그 쿠키를 이용해 HTTP요청을 하게 된다면 서버의 세션 저장소에서 사용자 A로 오인해서 정보를 잘못 가져올 수 있다. 이를 세션 하이재킹 공격이라고 한다.
1 .별도의 저장소의 관리가 필요하고 세션이 연결되어 있기 때문에 stateless한 서버를 만들 수 없다.
회원이 서버에 보내는 정보가 더 많다.
이름 / 발급일 / 이메일 / 유효기간 등등…
서버는 받은 정보만 가지고 판단을 한다. → 받은 정보에 이상이 없으면 회원을 통과 시킨다.
jwt 방식은 보내는 정보를 기본 세팅 값 / 보내는 정보 / 시크릿키등등을 합쳐서 base64형식으로 인코딩해서 보낸다.
JWT는 JSON Web Token의 약자로 인증에 필요한 정보들을 암호화 시킨 토큰을 말하며 Access Token으로 사용된다.
JWT를 생성하기 위해서는 Header, Payload, Verify Signature 객체를 필요로 한다.
Header는 토큰의 타입을 나타내는 typ과 암호화 할 방식을 정하는 alg 로 구성되어 있다.
Payload는 토큰에 담을 정보를 포함한다. 여기서 하나의 정보 조각을 클레임으로 부른다.
클레임의 종류로는 Registered, Public, Private 로 3가지가 존재한다. 보통 만료일시, 발급일시, 발급자, 권한 정보등을 포함한다.
Verify Signature는 Payload가 위변조되지 않았다는 사실을 증명하는 문자열이다. base64방식으로 인코딩한 Header, payload 그리고 secret key를 더한후 서명된다.
이 정보들은 base64 방식으로 인코딩 될 뿐, 따로 암호화 되지 않는다.
따라서 Header, payload는 누구나 디코딩하여 확인 할 수 있기에 정보가 쉽게 노출될 수 있다.
하지만 Verufy Signature는 Secret key를 알지 못하면 복호화 할 수 없다.

Stateless
받는 정보만 처리하면 되기 때문에 처리 속도가 빠르다.
jwt의 인코딩 방식은 기존의 정보가 변경되거나 시크릿키 등이 바뀌면 base64의 정보도 바뀌기 때문에 다른 상대가 위조를 시도하면 빠르게 알 수 있다.
확장성이 뛰어나다. 토큰 기반으로 하는 다른 인증 시스템에 접근이 가능하다.
탈취당했을때 사용 정지를하거나 제제를 하기 어렵다
→ HttpOnly cookie
→ 블랙리스트를 관리하는 장치를 따로 만든다(session과 별 차이없음)
→ 유효기간을 짧게 설정한다
: refresh토큰을 새로 만들어 주어야한다
대부분의 어플리케이션은 session방식으로 일일이 검증하는 것이 더 안전하다.
하지만, 회원수가 너무 많은 서비스의 경우 데이터를 전부 검증해야 하기 때문에 속도가 느릴수 있다. →이때 jwt를 고려하거나 OAuth같은 다른 인증방식을 고려할 수 있다.