티스토리 뷰

쿠키 기반 인증

  • 쿠키 기반 인증은 사용자가 인증 성공시 서버에서 응답 헤더에 Set-Cookie: email=someone@nothing.com과 같이 인증된 사용자의 식별 정보를 브라우저(클라이언트)에 전달한다. 브라우저는 이 값을 기억하여, 이후 서버에 대한 모든 요청 헤더에 앞서와 동일한 Cookie: email=someone@nothing.com과 같이 추가하여 서버에게 인증된 사용자임을 알리는 방식이다. [관련 링크]
  • 쿠키 기반 인증은 서버가 별도의 저장소에 인증 정보를 저장할 필요가 없어 가장 간단하지만, 가장 위험한 인증 방식이다. 사용자의 인증 정보를 통신 과정과 브라우저에 노출하게 되어 외부로부터의 공격에 취약하다. 심지어, 사용자 본인이 다른 사람의 쿠키 정보로 변경하면 그대로 로그인할 수도 있다. (크롬 브라우저의 EditThisCookie 확장 프로그램을 이용하여 손쉽게 쿠키 조작이 가능하다.) 이를 보완하기 위해, 쿠키 값을 서버에서 암호화하여 전달하기도 하지만, 궁극적인 해결책이 되지는 않는다.

세션 기반 인증

  • 세션 기반 인증도 쿠키를 사용하는 것을 전제로 한다. 차이점은 브라우저에 직접적으로 인증 정보를 전달하지 않아, 중요한 정보를 노출하지 않는 효과가 있다. 쿠키 기반 인증보다는 안전하여 오랫동안 선호하는 방식이다. 실제 인증 정보는 각 세션 키에 물려 웹 서버의 세션 저장소에 저장된다.
  • 세션의 생명주기는 웹 서버에 의해 처리된다. 일반적으로 브라우저를 종료하면 해당 세션 정보 또한 삭제되며, 웹 애플리케이션에서 임의로 세션 정보를 무효화할 수도 있다.
  • 응답 쿠키에 Secure 옵션을 추가하면 해당 세션 정보는 HTTPS 프로토콜로 요청할 때만 서버로 전달된다. HTTP일 경우에는 해당 정보가 제외된 채 전달된다. 이를 통해 통신 과정에서 원치 않는 세션 정보 노출을 피할 수 있어 보안을 강화할 수 있다. [관련 링크]
  • 응답 쿠키에 HttpOnly 옵션을 추가하면 쿠키로 전달된 세션 정보를 브라우저에 전달 했을 때, 브라우저의 JavaScript 레벨에서 접근 및 수정을 차단하여 보안을 강화할 수 있다. 해당 쿠키는 브라우저의 JavaScript 레벨에서는 접근 및 수정이 불가능하며, 오직 웹 서버 요청시에만 전송된다.
  • 많은 웹사이트가 세션 기반 인증을 사용한다. 대표적으로 GitHub 로그인을 예로 들면, login, password 파라메터를 받아 인증 성공 후 아래와 같이 세션 정보를 사용자에게 전달한다. 앞서 설명한 보안 강화를 위한 모든 옵션을 사용한 것을 확인할 수 있다.
// 응답 헤더
Set-Cookie: user_session=fYyUDAWB7NjLnh891vi65fRgFWily_1hzVnHK_HgZOY17qux; path=/; expires=Thu, 19 Sep 2019 06:07:26 -0000; secure; HttpOnly

// 이후 요청 헤더
Cookie: user_session=fYyUDAWB7NjLnh891vi65fRgFWily_1hzVnHK_HgZOY17qux

토큰 기반 인증

  • 토큰 기반 인증은 프론트엔드 개발이 SPA로 전환되는 분위기 속에서 각광 받는 방식이다. 기본적인 흐름은 세션 기반 인증과 동일하다. 차이점은 인증 정보 전달에 있어, 쿠키가 아닌 Authorization: Bearer 헤더와 로컬 스토리지(또는 세션 스토리지)를 이용한다는 점이다. 웹 서버는 인증이 성공하면, 쿠키가 아닌 HTTP 응답 바디에 인증 정보에 해당하는 access_token을 내려준다.
HTTP/1.1 200 OK
{
  "access_token": "fYyUDAWB7NjLnh891vi65fRgFWily_1hzVnHK_HgZOY17qux",
  "expires_in": 3600
}
  • 클라이언트는 이를 받아, 로컬 스토리지 또한 세션 스토리지에 저장한 후, 이후 웹 서버에 매번 요청시 아래와 같이 헤더에 인증 정보를 추가하면 된다.
Authorization: Bearer fYyUDAWB7NjLnh891vi65fRgFWily_1hzVnHK_HgZOY17qux

참고 글

댓글
댓글쓰기 폼