쿠키는 자동완성이나, 팝업 일주일간 보지 않기 등 사용자의 편의를 위하는 것이지만 지워지고, 조작되도 큰 지장이 없는 수준의 정보들을 저장하는데 사용됩니다.
세션은 사용자나 다른 누군가에게 노출되면 안되는 중요한 정보들은 서버안에서 다뤄집니다.쿠키로 노출시켜서는 안될 정보들이 있고, 세션을 남발하면 서버에 부담이 되어 과부하가 일어나기 때문에 웹을 설계할 때는 이 정보는 쿠키에 저장할 지 세션에 저장할 지 적절히 고려해야 합니다.
JWT는 사용자가 로그인을 하면 서버에서 발행해주는 토큰을 가지고 브라우저의 저장소에 토큰을 유지시키는 방법입니다.
OAuth2는 별도의 회원 가입없이 타 플랫폼의 아이디만 있으면 서비스를 이용 할 수 있어, 인증의 과정을 '타 서비스에게 위임'하는 인증방식입니다.
HTTP 프로토콜의 특징이자 약점을 보완하기 위해서 사용합니다.
1. Connectionless 프로토콜 (비연결성)
클라이언트가 서버에 요청(Request)을 했을 때, 그 요청에 맞는 응답(Response)을 보낸 후 연결을 끊는 처리방식입니다.
2. Stateless 프로토콜 (비상태성)
커넥션을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성이 있습니다.
서버와 클라이언트가 통신을 할 때 통신이 연속적으로 이어지지 않고 한 번 통신이 되면 끊어집니다.
따라서 서버는 클라이언트가 누구인지 계속 인증을 해줘야 해, 매우 귀찮고 번거로운 일입니다.
그런 번거로움을 해결하는 방법이 바로 쿠키와 세션입니다.
HTTP의 일종으로 사용자가 어떠한 웹 사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장하는 작은 기록 정보 파일입니다.
HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장하였다가 필요시 정보를 참조하거나 재사용할 수 있습니다.
일정 시간 동안 같은 사용자(브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 유지시키는 기술입니다.
여기서 일정 시간은 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점부터 웹 브라우저를 종료하여 연결을 끝내는 시점을 말합니다.
즉, 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라고 합니다.
쿠키와 세션은 비슷한 역할을 하며, 동작 원리도 비슷합니다. 그 이유는 세션도 결국 쿠키를 사용하기 때문입니다.
큰 차이점은 사용자의 정보가 저장되는 위치입니다. 쿠키는 서버의 자원을 전혀 사용하지 않으며, 세션은 서버의 자원을 사용합니다.
보안 면에서 세션이 더 우수하며,
쿠키는 클라이언트 로컬에 저장되기 때문에 변질되거나 request에서 스니핑 당할 우려가 있어서 보안에 취약하지만
세션은 쿠키를 이용해서 session-id만 저장하고 그것으로 구분하여 서버에서 처리하기 때문에 비교적 보안성이 높습니다.
라이프 사이클은 쿠키도 만료기간이 있지만 파일로 저장되기 때문에 브라우저를 종료해도 정보가 유지될 수 있습니다.
또한 만료기간을 따로 지정해 쿠키를 삭제할 때까지 유지할 수도 있습니다.
반면에 세션도 만료기간을 정할 수 있지만, 브라우저가 종료되면 만료기간에 상관없이 삭제됩니다.
속도 면에서 쿠키가 더 우수하며,
쿠키는 쿠키에 정보가 있기 때문에 서버에 요청 시 속도가 빠르고
세션은 정보가 서버에 있기 때문에 처리가 요구되어 비교적 느린 속도를 냅니다.
보통 쿠키와 세션의 차이에 대해서 저장 위치와 보안에 대해서는 잘 알고 있지만, 사실 가장 중요한 것은 라이프사이클입니다.
⇒ 쿠키는 브라우저를 종료해도 파일로 남아 있지만, 세션은 브라우저 종료시 세션을 종료합니다.
A. 세션이 쿠키에 비해 보안이 높은 편이나 쿠키를 사용하는 이유는 세션은 서버에 저장되고, 서버의 자원을 사용하기에 서버 자원에 한계가 있고, 속도가 느려질 수 있기 때문에 자원관리 차원에서 쿠키와 세션을 적절한 요소 및 기능에 병행 사용하여 서버 자원의 낭비를 방지하며 웹사이트의 속도를 높일 수 있습니다.
캐시는 이미지, 비디오, 오디오, css, js파일 등 데이터나 값을 미리 복사해 놓는 리소스 파일들의 임시 저장소
저장 공간이 작고 비용이 비싼 대신 빠른 성능을 제공
같은 웹 페이지에 접속할 때 사용자의 PC에서 로드하므로 서버를 거치지 않음
이전에 사용된 데이터가 다시 사용될 가능성이 많으면 캐시 서버에 있는 데이터를 사용
그래서 다시 사용될 확률이 있는 데이터들이 빠르게 접근 가능 (페이지의 로딩 속도 ↑)
캐시 히트(hit) : 캐시를 사용할 수 있는 경우 (ex. 이전에 왔던 요청이랑 같은 게 왔을 때)
캐시 미스(miss) : 캐시를 사용할 수 없는 경우 (ex. 웹서버로 처음 요청했을 때)
Json Web Token 약자로 모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰을 의미합니다.
JWT 정보를 request에 담아 사용자를 정보 열람, 수정 등 개인적인 작업 등을 수행할 수 있게 합니다.
Header, Payload, Signature의 3부분으로 이루어져 있습니다.
Json 형태인 각 부분은 Base64로 인코딩 되어 표현됩니다. 각 부분을 이어주기 위해 .구분자를 반환합니다.
Base64는 암호화된 문자열이 아니고, 같은 문자열에 대해 항상 같은 문자열을 반환합니다.
토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있습니다.
{ "typ": "JWT", "alg": "HS256" }
토큰에 담을 정보가 들어있습니다. 여기에 담은 정보의 한’조각’을 클레임(claim)이라고 부르고, 이는 name/value 의 한쌍으로 이뤄져있습니다. 클레임의 종류는 등록된(registered)클레임, 공개(public)클레임, 비공개(private)클레임 이 존재합니다.
{ "sub": "1234567890", **//** 등록된 플레임 "name": "John Doe", **//** 비공개 플레임 "iat": 1516239022 **//** 등록된 플레임 }
서명은 [헤더 base64 + 페이로드 base64 + SECRET_KEY ] 를 사용하여 JWT 백엔드에서 발행되며, 각 요청시 서명이 확인됩니다. 헤더 또는 페이로드의 정보가 클라이언트에 의해 변경된 경우 서명이 무효화됩니다.
JWT의 장점
JWT의 단점
Access Token
을 발급합니다.Access Token
을 사용자(클라이언트)에게 보냅니다. 여기까지하면 사용자는 로그인이 된 것입니다.사용자(클라이언트)는 API를 요청할 때 Authorization Header (권한)에 Access Token을 담아서 보냅니다.
서버는 secret key로 사용자가 보낸 토큰의 서명을 복호화하여서 유효한 토큰인지 확인합니다.
서버가 요청에 대한 응답을 사용자(클라이언트)에게 전달합니다.
발급받은 Access Token은 서비스에서 자체적으로 저장, 관리해야합니다.
참고, 인용