서버 개발을 하거나, 혹은 인터넷 사용자가 브라우저를 사용하다보면 쿠키라는 단어를 볼 수가 있다. 그리고 인터넷 사용 중 ‘세션이 만료되었습니다’ 라는 문구를 한 번쯤 봤을 거라 생각이 든다. 이 둘의 공통점은 사용자의 로그인 정보를 가지고 있다는 점이다. 서버 인증에 대해 이해하기 위해 본문의 개념들을 살펴보자.
HTTP 특징
HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜이다. 클라이언트인 웹 브라우저가 HTTP 를 통하여 서버에 정보를 요청하면, 서버는 응답을 통해 필요한 데이터를 전달한다. HTTP는 아래와 같은 특성이 있다.
비연결성(connectionless)
한번의 request/response 의 결과로 클라이언트가 서버의 응답을 받은 후, 서로 접속을 끊게 된다.이러한 특징은 서버의 자원 낭비를 줄일 수 있다는 장점이 있다.
비상태성(stateless)
비연결성과 긴밀한 특징으로 비상태성이다. HTTP가 요청 처리 후 연결을 끊어버리기 때문에, 클라이언트의 상태 정보가 남아있지 않는다. 다음 요청에서 이전 요청에 대한 정보를 가지고 있지 않아 매번 갱신을 해야한다. 그 요청이 로그인이라면, 로그인 창이 유지되지 않고 브라우저를 새로 켤 때마다 매번 로그인을 해야하는 것이다.
이렇게 HTTP의 비연결성과 비상태성을 보완하여 서버가 클라이언트를 식별하게 하기 위해 아래와 같이 몇가지 방안을 사용한다.
쿠키(Cookie)
개념
쿠키란 인터넷 사용자가 웹 사이트를 방문할 때, 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일을 말한다. 쿠키라는 네이밍은 웹 사이트를 방문할때마다 쿠키 부스러기처럼 사용자 컴퓨터에 임시파일들이 생기는 게 비슷하여 지어졌다고 한다.
브라우저마다 저장되는 쿠키는 다르다. 서버에서는 브라우저가 다르면 다른 사용자로 인식한다. 예를들어, 크롬으로 남긴 쿠키는 인터넷 익스플로어에서 사용할 수 없다.
사용목적
쿠키는 아래의 세가지 목적으로 사용된다.
1. 세션 관리
2. 개인화
3. 트래킹
예시
쿠키가 있기 때문에 여러 페이지를 이동할 때마다 로그인을 하지 않고 사용자 정보를 유지할 수 있는 것이다.
– ID 저장, 로그인 상태 유지
– 일주일간 다시 보지 않기
– 최근 검색한 상품들을 광고로 추천
– 쇼핑몰 장바구니 기능
단점
방문했던 웹 사이트에 대한 정보 및 개인정보가 사용자의 컴퓨터에 저장된다.
– 임의로 고치거나 지울 수 있고, 가로채기 쉬워 보안에 취약하다.
– 용량 제한으로 인해 많은 정보를 담을 수 없다.
– 웹 브라우저마다 쿠키에 대한 지원 형태가 다르기 때문에 브라우저 간 공유가 불가능하다.
이러한 단점을 보완하는 방안으로 세션에 대해 알아보자.
세션(Sesson)
개념
세션은 비밀번호 등 클라이언트의 사용자 인증 정보를 사용자 컴퓨터가 아닌 서버에 저장하고 관리한다. 일정 시간동안 같은 사용자(브라우저)로부터 들어오는 일련의 request 를 하나의 상태로 보고, 그 상태를 일정하게 유지시키는 기술이다. 즉, 방문자가 웹 서버에 접속해있는 상태를 하나의 단위로 보고 이를 세션이라고 한다.
세션은 서버에서 가지고 있는 정보이며 쿠키는 사용자에게 발급된 세션을 열기 위한 Session ID 를 의미한다. 쿠키만으로 인증을 사용하게 되면, 서버의 자원은 사용하지 않는다는 것을 의미하며 이는 즉 클라이언트가 인증 정보를 책임지는 것이다.
따라서 인증의 책임을 서버에게 주기 위해 세션을 사용하는 것이다.
동작방식
1. 사용자가 로그인을 한다.
2,3,4. 서버에서 계정정보를 읽어 사용자를 확인 후, 사용자의 고유한 ID값을 부여하여 세션 저장소에 저장한 후, 이와 연결되는 Session ID를 발행한다.
5,6. 사용자는 서버에서 해당 Session ID를 받아 쿠키에 저장을 한 후, 인증이 필요한 요청마다 쿠키를 헤더에 실어 보낸다.
7,8. 서버에서는 쿠키를 받아 세션 저장소에서 대조를 한 후 대응되는 정보를 가져온다.
9. 인증이 완료되고 서버는 사용자에 맞는 데이터를 보낸다.
* Session ID를 쿠키와 동일하게 생각하면 된다. 쿠키가 사용자 개념에서 더 큰 범주로써, Session ID를 쿠키로 저장한다고 이해하자.
세션(Session) 생성 확인
포털 사이트에 접속하여 Session ID가 쿠키 값으로 내려오는지 확인해보자
* cookie 값 확인하는 법
Chrome 접속 -> F12(개발자 도구) -> Application 탭의 좌측 바를 보면 각 사이트별 cookie 확인이 가능하다.
1. 위 사진처럼 최초 페이지 접속 시 Session ID라는 쿠카 값이 존재하지 않는다.
2. 로그인 후, 쿠키 값을 다시 확인해보자.
https://www.naver.com 이라는 곳 에서 JSESSIONID 라는 쿠키가 생성된 것을 확인할 수 있다.
특징
– 각 클라이언트에 고유 ID를 부여한다.
– Session ID로 클라이언트를 구분하여 클라이언트 요구에 맞는 서비스를 제공한다.
– 보안적 측면에서 쿠키보아 우수하다.
– 유저가 많아질수록 서버 메모리를 많이 차지하게 된다.
장단점
– 쿠키를 포함한 요청이 외부에 노출되어도 Session ID 자체는 유의미한 개인 정보를 담지 못한다.
– 각 사용자마다 고유한 Session ID가 발급되기 때문에, 요청이 들어올 때마다 로그인할 필요가 없다.
– 서버에서 세션 저장소를 사용하기 때문에, 요청이 많아지면 서버에 부하가 생긴다.
마치며
서버 인증에 대한 이해의 시작으로 쿠키와 세션에 대해 정리해보았다. 쿠키는 Persistent Cookie, 세션은 Session Cookie 라고도 부른다. 이 두가지는 인증 방식 자체의 차이는 없으나 데이터 저장 방식의 차이라고 할 수 있다. 세션 쿠키는 브라우저의 메모리에 저장되기 때문에 보안에 유리하지만, 사용자의 컴퓨터에 파일로 저장되는 지속 쿠키는 보안에 취약하다.
세션 쿠키인 서버 기반 인증의 문제점을 대항하기 위해 나온 인증 방식으로 토큰 기반 인증 방식이 있다. 이와 더불어 JWT에 대한 개념까지 ‘서버 인증 이해하기-4부’ 에서 다뤄보겠다.
출처
https://hahahoho5915.tistory.com/32
https://tansfil.tistory.com/58?category=475681