인증과 인가
HTTP 프로토콜
- HTTP 프로토콜의 특징
- 비연결지향(Connectionless) : 클라이언트의 request에 맞는 response를 보내고 접속 끊음
- 상태 정보 유지 안함 (Stateless) : 통신이 끝나면 상태 정보 유지하지 않음
- HTTP 프로토콜의 이 2가지 특징에 따라 새로운 페이지 요청할 때마다 새로운 접속이 이루어지며 이전 페이지와 현재 페이지 간의 관계가 지속되지 않는다. 이 약점을 보완하기 위해 3가지 인증방법(쿠키,세션,토큰)을 사용.
세션과 쿠키의 공통점
웹 페이지들 사이에서 공유하는 정보를 서버에 저장해두고, 웹페이지들을 매개한다.
세션과 쿠키의 차이점
쿠키
- 단순한 키-값 쌍
- 사용자 정보를 클라이언트 로컬에 파일로 저장됩니다.(클라이언트의 자원을 사용)
- 브라우저를 종료해도 계속해서 정보가 남아있는 특징이 있습니다.그러므로 직접 삭제하거나 만료시간을 설정하여 쿠키를 삭제해야 합니다.
- 쿠키는 클라이언트 로컬에 저장되어있기 때문에 다른 사용자에 의해서 임의로 변경이 가능하고, request에서 스나이핑 당할 수 있어 보안성이 낮습니다.
- 로컬에 저장된 파일에 바로 접근하여 사용하기 때문에 속도가 빠릅니다.
- 서버로부터 쿠키가 오면 웹 브라우저는 쿠키를 저장해두었다가 요청할 때마다 브라우저가 자동으로 쿠키 같이 보냄
- 쿠키는 요청과 응답의 헤더에 저장됨
쿠키 동작 절차
- 클라이언트 -> 서버 첫 요청 시 서버는 응답할 때 쿠키에 저장하고자 하는 정보를 Header 의 Set Cookie 로 함께 전달합니다.
- 클라이언트에 저장된 쿠키는 이후 매 요청 때마다 현재 브라우저에 저장된 쿠키를 Header 의 쿠키로 전달합니다.
- 서버는 클라이언트의 요청(Request)에서 쿠키 값을 참고하여 비즈니스 로직을 수행합니다. (ex 로그인 상태 유지, ...)
세션
- 세션은 서버 메모리에 저장됩니다.(서버의 자원을 사용) 그러므로 무분별하게 세션을 만들다 보면 서버의 메모리가 감당할 수 없어질 수가 있고 과부하로 인해 속도가 느려질 수 있습니다. 그래서 세션과 쿠키를 융합해서 사용해야 합니다.
- 세션도 만료시간이 있지만, 기본적으로 웹 브라우저가 종료되면 세션이 만료되어 사라집니다. 일정 시간 동안 같은 브라우저로부터 들어오는 요청을 하나의 상태로 보고 그 상태를 웹 브라우저가 종료할 때까지 유지합니다. 또한, 서버를 재시작하면(메모리 리셋) 세션 데이터가 사라집니다.
- 브라우저당 하나의 세션 ID가 생성됩니다 = 브라우저 당 하나씩 세션이 생성됨.
- 서버의 세션에 사용자 정보를 저장하고,클라이언트와는 쿠키를 이용해서 세션 ID로만 통신하기 때문에 비교적 보안성이 좋습니다. (클라이언트는 발급받은 세션 ID를 쿠키를 사용해서 저장)
세션 동작 절차
- 클라이언트가 서버에 요청시 서버는 필요에 따라 접속한 브라우저에 대한 세션 객체를 생성하여 세션 ID를 발급받습니다.
- 서버는 생성한 세션 ID를 쿠키값으로 만들고 Set Cookie라는 쿠키 헤더를 통해서 클라이언트 브라우저로 보냅니다.(response)
- 브라우저는 이 쿠키값을 저장해 두었다가 서버에 무언가 요청할 때마다 쿠키에 저장한 세션id를 쿠키 헤더를 통해서 서버에 전달합니다.
- 서버는 전송받은 세션ID를 이용해 해당 세션에 접근하여 작업합니다.
세션의 중요한 특징은 브라우저 당 하나씩 생성된다는 것입니다.브라우저가 서버에 세션 ID를 전송하면 서버는 그 값을 이용해서 브라우저를 구분합니다.
그리고 브라우저 종료시 세션 아이디는 제거되고, 서버에서도 세션이 제거됩니다.