로그인 유저 관리 기능을 구현하기 위해 웹 애플리케이션에서 유저 인증을 어떻게 확인하여 관리하는지에 대해 알아보려고 한다.
HTTP
는 Stateless
프로토콜이다. HTTP 프로토콜은 이전 ‘request’와 ‘response’의 상태를 기억하지 않는다는 뜻이다. 따라서 방금 전에 사용자가 인증을 통과하여 로그인을 했다고 하더라도, 웹 페이지는 그 사실을 알 수 없다. 매번 다시 로그인할 필요 없이, 해당 사용자가 인증되었다는 상태를 관리하기 위해 사용되는 기술이 cookie
다.
쿠키(cookie)
쿠키는 HTTP request와 response에 기억해야할 ‘정보’를 심는 기술이다. 쿠키의 작동 원리는 다음의 순서를 따른다.
- 클라이언트에서 최초로 인증 request가 서버로 송신된다.
- 인증이 통과되면, 서버는 response 헤더의
Set-Cookie
필드에 생성한 쿠키 값을 넣어서 클라이언트로 응답한다. - 해당 쿠키는 브라우저에 보존된다. (개발자모드-Application-Cookies-…) 또한 사용자의 PC에 파일 형태로 저장된다.
- 새로운 request가 발생할 때마다, 클라이언트는 자동으로 쿠키를 담아 서버로 요청을 전송한다.
- 서버는 클라이언트가 전송한 쿠키 값을 통해 사용자가 기존에 인증을 마친 상태임을 판단할 수 있다.
이처럼 쿠키는 로그인 상태, 장바구니, 웹페이지 언어 설정, 다크모드 등등 기억되어야 할 상태 정보를 클라이언트에 저장해두기 위해 사용되는 기술이다.
쿠키 생성 시 설정 가능한 속성들로는
- 쿠키의 만료 기한
웹 브라우저가 종료되면 쿠키도 사라지게 하거나 계속 유효하도록 설정할 수 있고, 쿠키가 일정 기간 동안만 유효하도록 설정할 수도 있다.- https를 통해 통신할 때만 쿠키를 전송하도록 설정할 수 있다.
- 쿠키의 scope
특정 도메인이나 디렉토리에서만 쿠키가 활성화 되게끔 설정할 수 있다.- etc..
이처럼 쿠키를 사용해 ‘이전에 통신했던 내용’을 기억할 수 있게 되자, 웹 애플리케이션에서 사용자 별로 다르게 서비스를 제공하는 ‘개인화(Personalization)‘와 ‘인증’이 가능해졌다.
하지만 쿠키는 클라이언트 사이드에서 사용자와 관련된 다양한 정보를 직접 들고 있기 때문에 보안 상의 위험이 존재한다. 쿠키를 탈취 당하면 해당 클라이언트의 정보가 고스란히 노출되기 때문이다.
세션은 쿠키의 이 같은 단점을 보완할 수 있다.
세션(session)
쿠키가 클라이언트에 정보를 직접 보관하는 방법이었다면, 세션은 식별자만 클라이언트에 보관하고 실제 정보는 서버에 저장해두고 상태를 관리하는 방법이다. 세션 또한 쿠키를 기반으로 작동한다. 식별자로 사용되는 세션ID 값을 쿠키에 담아서 사용하기 때문이다.
세션ID는 서버에 보관되고 있는 정보에 접근하는 ‘열쇠’라고 생각하면 된다.
따라서 클라이언트 사이드에서 쿠키가 탈취 당하더라도, 식별자인 세션ID 값은 노출이 되지만 실질적인 정보들은 서버에 있기 때문에 정보가 직접적으로 노출되지 않는다. 세션의 작동 방식은 다음과 같다.
- 클라이언트에서 최초로 인증 request가 서버로 송신된다.
- 인증이 통과되면, 서버는
express-session
같은 미들웨어를 사용하여 저장소에 세션을 생성하고, 세션ID를 쿠키에 담아서 응답한다. - 브라우저는 쿠키를 보존하므로, 새로운 request가 발생할 때마다 서버는 클라이언트가 보내온 쿠키의 세션ID를 세션 저장소의 정보와 대조하여 사용자를 식별한다.
세션도 쿠키와 마찬가지로 유효 기간을 설정할 수 있다. 그러나 쿠키는 파일 형태로 저장되기 때문에 브라우저가 종료되어도 유효기간이 남아있다면 여전히 존재하는 반면, 세션은 서버의 메모리에 저장된다. 따라서 브라우저가 종료되면 유효기간이 남아있더라도 삭제가 된다는 차이가 있다.
이처럼 세션은 쿠키에 비해 보안적으로 낫다는 장점이 있지만 단점도 존재한다. 클라이언트에서 정보를 직접 제공해주는 쿠키와 달리 정보를 얻기 위해 서버를 거쳐야 한다는 점에서 속도의 차이가 발생하고, 사용자의 정보를 서버에 저장해야하기 때문에 많은 사용자가 서비스를 이용하는 경우 서버 자원의 소모가 크다. 그리고 세션ID를 탈취하여 서버에 전송하는 경우, 실제 인증된 사용자가 아님에도 세션 정보의 주인인 것처럼 행세할 수 있다는 보안 상의 문제도 여전히 존재한다.
이러한 쿠키와 세션의 한계를 극복하고자 최근에는 JWT(JSON Web Token)
라는 기술이 주로 사용된다. To be continued..
참고
Opentutorials.org | 세션과 인증
MDN Web Docs | HTTP Cookie
세션 동작 원리 - 쿠키와 세션의 관계