우리는 웹브라우저를 통해 접속하는 홈페이지에서 로그인을 하지 않거나 회원가입을 하지않으면 특정 컨텐츠를 이용하지 못하는 경우를 충분히 경험해 보았을 것이다. 서비스를 담당하는 회사 측에서 알 수 없는 사용자가 이용하였을 때에 문제가 발생할 수 있는 일부 컨텐츠에 대한 권한을 제한하고, 로그인을 통해 회원임을 인증하면 어느 대상이 컨텐츠를 정상적으로 이용하는지 확인할 수 있다.
이 처럼 일부 악용될 수도 있는 컨텐츠나 상업적 목적을 위한 컨텐츠들에는 회원인증을 요청하는게 일반적이다.
회원인증방식에는 여러가지가 있다. 대표적으로 쿠키방식, 세션방식, 토큰방식이 존재한다.
이 방식이 단일적인 것이 아니라 세션에 토큰을 저장한다던지, 쿠키에 토큰을 담아서 보낸다던지 복합적인 방식으로 회원정보를 인증하기 위한 방법들이 있다.
쿠키(Cookie)
쿠키는 웹 브라우저에 저장되는 작은 텍스트 파일이다.
서버에서 브라우저로 쿠키를 보내면, 브라우저는 쿠키를 저장하고, 이후에 같은 서버로 요청을 보낼 때마다 쿠키를 함께 보낸다.
서버는 브라우저가 보낸 쿠키를 확인하고, 해당하는 사용자의 정보를 식별한다.
세션(Session)
세션은 서버에 저장되는 정보이다.
클라이언트(브라우저)가 서버에 요청을 보내면, 서버는 해당 클라이언트에게 고유한 세션 ID를 부여하고,
이후에 같은 클라이언트로부터 요청이 들어오면, 서버는 세션 ID를 확인하고, 해당하는 사용자의 정보를 식별한다.
세션은 서버에서 관리하기 때문에, 쿠키보다 보안성이 높다고 한다.
토큰(Token)
토큰은 JWT(JSON Web Token) 형식으로 구성되는 문자열이다. 우리가 'bearer agpiartorparg...'으로 주고 받는 형태의 토큰 그 자체가 json형식의 문자열을 주고 받는 것이다.
토큰에는 사용자 인증 정보를 포함하고 있으며, 서버에서 발급하고 검증할 수 있다.
클라이언트는 로그인 후, 서버로부터 토큰을 받아서 저장하고, 이후에 API 요청 시에는 토큰을 함께 보내면,
API 서버는 받은 토큰을 검증하고, 해당하는 사용자의 올바른 사용자인지 정보를 식별하고, 정보 식별이 정상적이면 그 API요청의 response를 보내주고 비정상적이라면 에러를 반출한다.
토큰 방식은 Stateless한 구조로, 서버의 확장성이 높아지는 장점이 있다. 또한, 쿠키와 세션 방식에서 발생할 수 있는 CSRF 공격 등의 보안 이슈를 방지할 수 있다.