서비스를 이용하려는 유저가 등록된 회원인지 확인하는 절차 (ex. 로그인)
인증을 받은 유저가 특정 리소스에 접근할 수 있는 권한이 있는지 확인하는 절차 (ex. 마이페이지에서 개인정보를 확인)
인증과 인가가 필요한 이유는 HTTP 프로토콜의 이 2가지 특성 때문이라고 볼 수 있다.
각 요청이 독립적이며, 서버가 이전 요청에 대한 정보를 기억하지 않는다. 따라서 각 요청마다 서버에서 요구하는 모든 상태 정보를 담아서 요청해야 한다. 서버는 클라이언트의 상태를 별도로 기억할 필요없이 주문받은 대로 응답한다. 무상태라는 특성 덕분에 동일한 서버를 여러개로 확장시킬 수 있다. (Scale-Out)
서버와 클라이언트는 연결되어 있지 않다. 비연결성으로 인해 최소한의 서버 자원으로 서버를 유지할 수 있다. 아래의 그림에서 왼쪽의 경우가 비연결성을 표현한 것이라고 볼 수 있다.

출처: https://hanamon.kr/네트워크-http-http란-특징-무상태-비연결성/
클리이언트와 서버 간의 지속적인 요청(예로 로그인 상태가 유지되고, 로그인한 유저만 누릴 수 있는 서비스를 제공하는 것)을 위해 세션 기반의 인증/인가 방식 토큰 기반의 인증/인가 방식을 사용한다.
브라우저에 저장되는 작은 데이터 조각. key-value 형태로 저장된다. 마치 서버가 클라이언트의 인증 상태를 기억하는 것처럼 구현할 수 있다. 쿠키는 별도로 삭제 처리하거나 유효기간이 만료되지 않는 한, 서버와 통신할 때 자동으로 주고받는다. 서버에 특정 API 요청을 했을 때(ex. 로그인 요청) 서버가 응답 시 헤더에 Set-Cookie 속성으로 쿠키 정보를 담아주면, 응답을 받은 브라우저는 쿠키를 브라우저에 자동으로 저장한다. 서버에 http 요청 할 때 마다 브라우저에 저장되어 있는 쿠키는 자동으로 서버에 보내진다. 쿠키는 클라이언트에서 직접 추가/수정/삭제할 수 있다.

사용자와 서버 간의 연결이 활성화된 상태 또는 인증이 유지되고 있는 상태
로그인 성공 → 서버에서 세션 생성 및 저장(key-value 형식) → key(sessionId)를 브라우저에 응답(by 쿠키)

서버에서 sessionId를 설정하고 브라우저로 보내면, 브라우저는 이를 쿠키에 저장한다.
서버는 인가가 필요한 API 요청을 받으면 클라이언트 쿠키에 들어 있는 sessionId를 세션 저장소에 조회하고 존재한다면 DB에 데이터를 조회하여 응답한다.

세션 인증 방식에는 확장성 문제, 메모리 사용량 증가, 상태 유지의 복잡성, 보안 문제와 같은 한계점이 존재한다. 세션 인증 방식의 이러한 한계를 극복하기 위해 등장한 것이 바로 JWT(JSON Web Token)이다. JWT는 서버 확장성, 무상태성 유지, 보안성 등을 개선한 토큰 기반 인증 방식이다.
클라이언트에서 보관하는 암호화 또는 인코딩된 인증 정보. 서버의 상태를 유지하지 않고도 클라이언트의 인증 상태를 확인할 수 있게 한다. 세션처럼 서버에서 사용자의 인증 정보를 보관할 필요가 없다. 웹에서 인증 수단으로 사용되는 토큰은 주로 JWT (Json Web Token)이다.
JWT는 세 가지 주요 부분으로 이루어진다.
어떤 종류의 토큰인지와 어떤 알고리즘으로 서명되었는지에 대한 정보.
데이터가 들어있는 부분. 사용자 ID, 토큰의 만료 시간 등.
토큰이 위조되지 않았는지 확인하는 역할. 서버만이 알 수 있는 비밀 키로 서명되어 있다.

