인증, 인가란?
- 인증 : 사용자의 신원을 검증하는 프로세스
ex) 로그인(비밀번호), 일회용 핀 등
- 인가 : 사용자에게 특정 리소스나 기능에 액세스할 수 있는 권한을 부여하는 프로세스
ex) 관리자 페이지, 특정 게시물 삭제 or 수정 권한 등
⇒ 이러한 인증, 인가를 위해서 쿠키, 세션이 필요하다.
왜 세션, 쿠키가 필요할까?
우리가 Web에서 사용하는 프로토콜은 HTTP이다.
HTTP의 특성에는 Stateless, Connectionless가 있다.
- Stateless : 통신이 끝나면 상태를 유지하지 않는 특성이다.
- Connectionless : 요청과 응답 후에 연결을 끊어 버리는 특성이다.
그렇기에 한 번의 HTTP 통신 이후에 이 통신에서의 정보를 기억하고 있지 않는다.
그럼 로그인 했던 정보나 권한에 대한 정보를 어떻게 확인하지?? 매번 모든 요청마다 아이디와 비밀번호를 정보로 보내서 로그인하고 권한을 확인한 후에 요청된 작업을 해야하는 것인가?? 너무 비효율적인데??
⇒ 그래서 세션, 쿠키가 필요하다.
세션 vs 쿠키
세션과 쿠키 모두 웹에서의 인증, 인가를 위해 사용이 되는 친구들이다. 그렇다면 이 둘의 차이점은 무엇이고 어떤 방식으로 인증, 인가에서 사용될까?
일단 이 둘의 차이점은 사용자가 제공한 정보가 저장되는 위치이다.
세션에선 해당 정보를 서버 측에 저장되는 반면에 쿠키에선 해당 정보를 사용자의 브라우저 혹은 클라이언트 측에 저장된다. 이 둘에 대해서 자세히 알아보자.
세션이란?
세션은 서버에 저장된 전역 변수라고 생각하면 좋을 것 같다.
각 세션에는 저장된 값을 검색하기 위한 고유 ID가 할당이 되고 이는 응답 헤더 Set-Cookie
에 실어서 보내진다. 해당 응답을 받은 클라이언트 측은 Set-Cookie
에 할당된 세션 ID를 포함하는 쿠키를 저장한다. 이제 요청 시에 해당 세션 ID를 쿠키 헤더 Set-Cookie
에 실어서 보내면 서버 측에선 매 요청마다의 인증없이 식별이 가능해진다. ( 만약 클라이언트 브라우저가 쿠키를 지원하지 않으면 세션 ID가 URL에 표시됨. ) 세션은 비교적으로 쿠키보다 큰 데이터를 저장할 수 있는 용량이 있다. 브라우저를 닫으면 세션 값이 자동으로 삭제되고 값을 영구적으로 저장하기 위해선 DB에 저장해야한다.
⇒ HTTP에서 Stateless가 중요한 이유가 서버 확장 시에 서버 간 정보 공유가 적은 것이 비용 최소화에 도움이 되어서 중요하다고 알고 있는데 그럼 서버 간 세션 ID를 공유해야해서 좋지 않는 것이 아닌가? (확장성 문제)
⇒ 이를 해결하기 위해서 요청이 무조건 세션을 생성한 서버로 향하도록 하는 Sticky Session, 여러 웹 서버가 모두 동일한 세션 정보를 가지고 있는 Session Clustering 방식보다 세션 정보를 관리하는 서버를 별개로 두는 Session Storage 방식이 가장 많이 쓰인다고 한다.
쿠키란?
쿠키는 웹 서버가 클라이언트 브라우저에 저장하는 사용자 정보가 담긴 최대 크기 4KB의 작은 파일이다. 이는 유효한 시간을 명시할 수 있어서 브라우저가 종료되어도 인증이 유지된다는 특징이 있다. (ex. 자동로그인)
⇒ 만약 쿠키가 엄청나게 커지면 매 요청마다 엄청나게 큰 쿠키를 실어서 보내야 한다는 것인가? (오버헤드 문제)
⇒ 그렇기에 쿠키가 커지면 요청마다 큰 오버헤드가 발생하게 된다. 그래서 쿠키의 크기를 최대 4KB로 제한하고 사이트당 쿠키 갯수에 제한도 존재한다.
또 요청에 사용자 정보를 실어서 보내는 방식이기에 보안에 취약하다.
⇒ 세션과 쿠키는 비슷한 역할에 동작원리도 비슷하다. 세션도 쿠키를 이용하기 때문이다. 그렇다면 이 둘의 차이점에 대해서 더 알아보자.
세션과 쿠키의 차이점
가장 큰 차이는 앞서 말했던 정보의 저장되는 위치 차이이다. 세션은 서버에 사용자 정보가 저장되고 그 때 생성되는 세션 ID를 쿠키로 클라이언트가 저장해 식별하는 방식이고 쿠키는 사용자 정보를 로컬에서 쿠키로 저장하고 매 요청마다 해당 쿠키를 보내는 방식이다. 다른 차이점들을 생각해보자.
- 보안
- 보안 상으로 세션이 쿠키보다 훨씬 유리하다. 쿠키는 사용자 정보가 담긴 쿠키를 요청에 담기에 헤더를 통해 정보가 노출된다. 반면 세션은 세션 ID만 노출되기에 안전하다.
- 속도
- 쿠키는 정보가 서버 요청 시 헤더에 담겨가기에 빠르고 세션은 헤더에 담긴 세션 ID를 통해서 서버에서 찾아야 하기에 더 느리다.
- 라이프 사이클
- 쿠키는 만료시간이 있긴 하지만 파일로 로컬에 저장되어서 브라우저를 종료해도 정보가 남아있다. 물론 세션도 만료시간을 정할 수 있지만 브라우저가 종료되면 만료시간 상관없이 삭제된다.
⇒ 속도는 좀 느려도 보안 상으로 세션을 사용하면 좋을 것 같다는 생각이 들지만 서버에 정보를 저장하기 때문에 서버 자원이 부족해지면 속도가 느려질 수 있다. 그런 경우 쿠키가 유리하다.
⇒ 그래서 최근엔 이런 문제를 보완한 토큰 기반의 인증방식을 사용한다고 한다.
Reference
Uploaded by N2T