인증 (Authentication) ( session / cookie)

인증이란 어떤 의미일까?

You are who you say you are

‘너는 너가 누구라고 말한 사람이다’ 라는 말이 있다.

인증 방법은 여러가지 이다.

  • You know
    • password
    • pin-code
  • You have
    • mobile phone
    • hardware token
  • You are
    • fingerprints
    • signature

통상적으로 서버에서는 ‘You know’ (password / pin-code)를 이용하여, 인증을 하게 된다.

http는 stateless 프로토콜, 즉, 상태를 보관하고 있지 않는데 서버에서는 어떻게 auth가 일어나는 걸까 ?

클라이언트가 가입을 하고, 서버는 그 정보를 DB에 저장한다. 그리고 클라이언트가 로그인하여 특정 권한이 필요한 리소스에 접근하려할때 서버는 어떻게 알고 이 클라이언트에게 response를 보내줄까 ?


Auth 전통적인 방법 – 세션 / 쿠키를 이용하는 방법

  1. 클라이언트가 서버에 로그인 요청을 보낸다.
  2. 서버는 데이터베이스에서 사용자가 보낸 id/pwd 가 일치하는지 확인한다.
  3. 유효한 사용자라면, 서버는 session을 만들어서 session 데이터베이스에 저장한다.
    • 이 세션에는 userId, sessionId, expiration_time 등이 포함 되어 있음
    • session을 저장하는 곳은 DB 일 수도 있고, 파일 시스템 혹은 메모리 상에 보관할 수 도 있다. 통상적으론 DB에 저장한다.
  4. 클라이언트에게 세션과 관련된 정보를 보내준다.
    • 보통은 쿠키에 sessionId를 넣어서 보내게 되며 ‘HTTP only’ 라는 옵션을 주게되면, 브라우저에 의해서만 읽을 수 있다.
    • 클라이언트측에서 해당 sessionId 값을 자바스크립트나 특정한 프로그램으로 확인이 불가능하다.
  5. 클라이언트가 추후 다른 요청을 할때, 브라우저가 이 쿠키의 정보를 포함하여 보내준다.
  6. 서버는 클라이언트에서 보내준 쿠키 sessionId를 통해서 세션 DB에 존재하는 세션인지, 만료되진 않았는지 검사한다.
  7. 문제가 없으면 서버에서 정상 응답 코드와 함께 요청한 데이터를 보내준다.
  • 세션과 쿠키 방법을 사용하면 좋은점 ? 👍
    • 세션 데이터베이스에 모든 세션에 대한 정보를 보관하고 있으므로, 신뢰할 수 있는 데이터가 있다
    • 쿠키를 사용하기 때문에 서버에서 보낼때도 쉽고, 클라이언트에서 별도로 처리하지 않아도 브라우저에서 처리해주므로 간단하게 구현이 가능하다.
    • HTTP only 옵션을 사용하는 경우, 보안성을 높여서 사용할 수 있다.
    • 사용자에 대한 정보를 보내는 것이 아니라 sessionId에 대해서 보내므로, 중간에 가로채더라도 이 사용자에 대한 정보가 들어있지 않아 안전하다.
  • 세션과 쿠키 방법을 사용하면 안좋은 점? 👎
    • Stateful – 서버에서 시시각각 변하는 로그인하는 사용자에 대한 세션의 정보를 보관하고 있으므로, 서버에 상태가 있다.
    • 한 서버에 세션을 보관하고 있으므로, 많은 서버들이 이 세션의 정보를 확인하기 위해서 하나의 서버에 접속해서 네트워크 요청을 해야한다. 즉, 클라이언트의 요청을 처리하기위해 내부적으로 여러가지 네트워크 요청을 해야하므로 시간이 오래걸리고 성능이 좋지 않을 수 있다.
    • 분산형 시스템으로 서비스를 잘 디자인 했음에도 불구하고, 세션때문에 성능이 좋지 않은 경우도 발생한다.