Topic
앞서 알아본 인증과 인가를 웹사이트에서 어떤 방식으로 이루어지는지 알아보자.
HTTP 통신에선 stateless한 특성으로 인해 인증을 받은 사용자가 새롭게 보내는 요청엔 인증된 상태 정보가 유지되지 않는다. 즉 인증/인가가 필요한 상황마다 매번 인증/인가 절차를 거쳐야하는 문제가 발생한다. 따라서 현재 사용자가 인증을 받고 리소스에 접근한 인증된 사용자라는 것을 증명할 수 있는 방법이 필요한데 대표적으로 쿠키(cookie), 세션(session), 토큰(tokken) 방식이 존재한다.
인증 방식
1. Cookie에 저장
- 서버에서 클라이언트 브라우저로 전송하는 데이터 조각
- key-value 형식으로 저장
- 사용자가 브라우저에 방문할 때마다 서버에 의해 생성됨
- 장점
- 구현이 간단하고 사용이 편리함
- 기존 로그인 정보를 쿠키에서 가져와 사용하므로 다시 자동으로 인증이 가능 => 사용자 경험 향상
- 단점
- 클라이언트에 쿠키 값이 그대로 노출되므로 보안상 좋지 않음
- 용량에 제한이 있음 (약 4KB)
- HTTP 요청마다 서버로 전송되어 불필요한 데이터 전송이 발생 가능
2. Session에 저장
- 사용자가 서버에 연결되어 있는 동안 서버 측에서 유지하는 상태 정보
- 로그인 후 세션 ID를 생성하고 사용자 정보가 아닌 생성한 이 값을 쿠키에 저장 => 이를 통해 사용자를 식별
- 장점
- 쿠키에 비해 안전함
- 용량 제한 없음
- 사용자별 세션 구분이 가능하여 개인화된 서비스 제공 가능
- 단점
- 서버에 값이 저장되므로 부하가 많이 감
- 서버가 여러 대인 경우 세션 공유 및 동기화에 어려움이 따름
- 브라우저 종료 후 세션 만료 관리 시기를 결정해야 함
3. Token에 저장
- 사용자를 인증할 수 있는 암호화된 Access Token을 발행하고 인증할 때마다 서버에 해당 토큰을 실어서 함께 요청을 보냄
- 장점
- 사용자 정보, 권한 등도 함께 포함 가능
- 별도의 세션 저장소가 필요없음
- 개발 언어 및 플랫폼에 종속적이지 않음
- 단점
- 용량이 커 네트워크 Overhead가 증가
결론
인증 절차의 지속성을 위한 해결 방법을 정리하여 인증/인가 부분에 있어 좀 더 깔끔한 개념을 정립할 수 있게 되었다.
다음엔 Token을 이용한 방법을 보다 상세하게 정리해서 포스팅하겠다.