조만간 필요할 것 같아서 계속 기억해야 할 주요 개념 중 하나인 인증 방법과 관련된 내용을 정리해보도록 하겠습니다.
면접 중간에 배운 기억이 나는데 이미 퇴색한 것 같다.
모호하게 알려진 것은 실제로 “내 것”이 아닙니다.
쿠키
-
쿠키를 통해 서버는 데이터를 브라우저에 삽입할 수 있습니다.
-
당신에 대한 것들을 기억하기 위해
-
웹 사이트를 방문하면 브라우저가 서버에 요청을 보냅니다.
-
서버는 모든 데이터와 요청된 정보로 응답합니다.
-
답변 외에도 브라우저에 저장하려는 쿠키가 있을 수 있습니다.
-
사용자가 브라우저에 쿠키를 저장하면 사용자가 웹 사이트를 방문할 때마다 쿠키가 포함된 요청이 서버로 전송됩니다.
-
쿠키는 도메인별로 제한됩니다.
쿠키에도 유효기간(서버가 설정한 기간에 따름)이 있습니다.
(예) YouTube에서 제공하는 쿠키는 YouTube로만 전송됩니다. -
쿠키는 인증 및 기타 정보를 저장할 수 있습니다.
-
예를 들어, 웹사이트의 언어 설정이 변경되면 서버는 이에 대한 응답으로 쿠키를 반환하고 브라우저는 요청에 대한 응답으로 언어 값을 쿠키로 받아 저장합니다.
-
따라서 다음에 웹 사이트를 방문하면 쿠키(언어 값)와 함께 서버로 전송되고 서버는 쿠키 값에 해당하는 언어로 페이지를 제공합니다.
HTTP 프로토콜
- HTTP 프로토콜은 웹 사이트에 액세스하는 데 사용되는 프로토콜입니다.
- 또한 무국적자입니다.
이는 서버에 대한 각 요청이 이전 요청과 완전히 독립적으로 처리됨을 의미합니다.
(요청 사이에 연결이 없습니다.
메모리가 없습니다.
) - 따라서 서버는 요청이 종료될 때 사용자가 누구인지 잊어버립니다.
- 요청이 있을 때 클라이언트가 누구인지 알려주는 세션 및 토큰 방법이 있습니다.
세션
-
동작 순서
- 로그인을 원하는 사용자는 자신의 ID와 PW를 서버로 전송
- 유효한 사용자이면 서버는 세션 DB에 사용자에 대한 정보를 생성합니다.
- 저장과 동시에 별도의 ID가 존재하며 이 세션 ID는 쿠키를 통해 브라우저에 저장됩니다.
- 따라서 동일한 웹사이트의 다른 페이지를 방문하면 브라우저는 세션 ID와 함께 쿠키를 서버로 보냅니다.
- 서버는 세션 ID로 들어오는 쿠키를 확인합니다.
(이 시점까지 서버는 요청자가 누구인지 모릅니다.
) - 서버는 세션 id로 세션 db를 확인하여 해당 사용자가 누구인지 알아냅니다.
- 모든 사용자 정보가 서버에서 사용 가능한 것이 중요합니다!
(사용자가 가지고 있는 것은 세션 ID 값입니다.
) - 쿠키는 세션 ID를 전송하는 데만 사용됩니다!
즉, 쿠키는 중개자이며 쿠키는 기본 앱이 아닌 브라우저에만 존재합니다.
-
요약하면 서버는 모든 사용자의 세션 정보를 유지하므로 사용자가 요청할 때마다 쿠키를 받아 세션 ID를 확인하고 사용자를 찾은 DB에 접속해야 합니다!
-
따라서 사용자가 많아질수록 더 많은 DB 자원이 필수적이다.
-
세션용 DB는 주로 Redis를 사용합니다.
(빠르고 저렴한 DB) -
강제 로그오프와 같은 기능을 구현할 수 있습니다.
토큰
- 기본 앱에서는 쿠키를 사용할 수 없으므로 이 경우 토큰을 사용하세요!
- 토큰은 이상하게 보이는 문자열입니다.
JWT
-
세션의 한계를 극복한 것 같았다.
-
JWT가 토큰 형식으로 사용자 인증을 처리하면 서버에 세션 DB가 필요하지 않습니다.
-
또한 사용자를 인증하기 위해 많은 작업을 수행할 필요가 없습니다!
-
서버는 토큰을 만들고 확인만 합니다.
-
그러나 JWT는 암호화되지 않습니다.
따라서 누구나 열어서 내용을 볼 수 있습니다.
(비밀 정보가 JWT에 있는 경우 X) -
사용자에 대한 정보를 강력하게 관리하려면 JWT 대신 세션을 사용하는 것이 좋습니다.
-
동작 순서
- 로그인을 원하는 사용자는 자신의 ID와 PW를 서버로 전송
- 서버는 사용자의 정보를 가져와 서명 알고리즘을 사용하여 서명을 생성합니다.
- 그러면 생성된 서명정보는 문자열 형태로 사용자에게 전달된다.
- 일반적으로 JWT는 세션 ID보다 훨씬 깁니다.
(길이 제한은 없습니다.
) - 사용자가 요청을 보내면 세션 ID와 마찬가지로 “서명된 정보(토큰)”를 서버로 보내야 합니다.
- 서버는 토큰을 받으면 서명이 유효한지(변조되었는지) 확인하고 사용자를 인증합니다.