-
Cookie 서명JavaScript/Node.js 2018. 12. 1. 23:56
Cookie 서명
이번 시간에는 쿠키 데이터를 서명하는 방법을 알아보자.
쿠키는 클라이언트 PC에 간단한 데이터들을 저장하기위한 기능이라고 설명했었다.
웹 프로그램을 이용하는데 필요한 데이터이니만큼 보안 또한 적지않게 중요하다 할 수 있다.
Cookie 데이터의 취약한 보안성
이전 시간에 우리가 쿠키 데이터가 클라이언트 PC에 저장되는지를 확인하기 위해서 개발자도구(F12)를 열어 Network탭에서 서버와 클라이언트간에 전달되는 데이터를 확인했었다.
그 결과 count라는 쿠키에 서버에서 값을 설정하는 "Set-Cookie" 헤더정보를 통해 쿠키에 저장되는 값을 확인할 수가 있었다.
이러한 직접적인 데이터 공개는 보안상 취약점이 되기 때문에 권장하는 작업이 아니다.
클라이언트 PC에 값을 저장해야한다면 최소한의 보안을 신경써서 작업해야할 필요가 있다.
Cookie 데이터 서명 알아보기
아무리 간단한 값이라도 클라이언트 PC에 저장하는 데이터는 필히 보안성을 갖춰야한다.
어떻게해야 쿠키의 데이터를 서명할 수 있을까.
이미 우리는 그 방법을 알아봤다.
Express API 문서 사이트에서 Response 객체의 cookie()에 대한 설명들을 읽었을 때 말이다.
"cookie-parser 미들웨어를 사용할 때, 이 메소드는 서명된 쿠키를 지원한다.
true로 설정된 'singed'옵션을 포함하기만 하면 된다.
그 후에 res.cookie()는 cookieParser(secret)에 전달된 암호를 사용하여 값을 서명한다.
이후에 req.signedCookie 객체를 통해 값에 접근할 수 있다."
app.use()를 통해 cookieParser()객체를 사용 선언할 때 암호를 인자로 넣으면 서버와 클라이언트 간 쿠키 정보 통신에 있어서 데이터를 변조 처리하여 작업한다.
그럼 singed 옵션은 무엇일까?
그것 또한 이전 시간에 알아봤다.
res.cookie()를 설명하는 가장 첫 목록에 테이블 표를 통해 설명해줬다.
signed 옵션은 boolean의 데이터 타입을 가지며 쿠키를 서명할 것인지를 나타내는 옵션이다.
이렇게 서명한 데이터에 접근하기 위해서는 req.signedCookie를 사용하라고 설명되어 있었다.
그럼 이제 req.signedCookie에 대한 API 문서를 보자.
"cookie-parser 미들웨어를 사용하는 경우, (req.signedCookies)이 속성은 요청에 의해 서명되지 않고 사용할 준비가 된 쿠키를 보낼 때 서명을 포함한다.
서명된 쿠키는 개발자의 의도를 보여주기 위해 다른 객체에 속해있다; 그렇지 않으면 악의적인 공격이 req.cookie 값(스푸핑하기 쉬운 것들)의 위치에서 발생할 수 있다.
쿠키에 서명하는 것은 숨기거나 암호화하는 것이 아니라 그저 간섭을 간단하게 방지하는 것이다.(서명에 사용하는 비밀 키는 비공개이기 때문이다.)
서명하지 않은 쿠키를 보내면 속성의 기본 값은 빈 객체로 설정된다.{}"
쿠키에 서명을 하게될 경우 서버에서 요청에 의해 쿠키 데이터에 접근하기 위해서는 req.signedCookies를 사용하고 서명하지 않은 쿠키의 데이터에 접근하는 경우 req.cookie를 사용한다는 것을 잊지말자.
Cookie 데이터 서명하기
클라이언트 PC에 저장하는 쿠키의 데이터를 안전하게 사용하기 위해 서명하는 방법을 알아보았으니 이제 쿠키 데이터를 안전하게 서명하여 사용해보자.
사용방법에 의하면 cookieParser()객체를 사용선언할 때 인자로 서명을 위한 암호 키를 전달하라고 설명했었다.
인자로 서버와 클라이언트 PC간에만 해석할 수 있도록 암호 키를 입력하자.
여기서 암호 키를 작성하는 것에는 크게 규격이 없으며 개발자의 자유이다. 단 쉽게 유추할 수 있는 값은 사용하지 말자.
인자에 암호 키를 작성했다면 앞으로 서명된 쿠키를 생성하고 활용할 때 서버와 클라이언트 PC만 알아볼 수 있도록 통신하게 된다.
우리는 cookieParser에 암호 키를 전달했으므로 이제 쿠키를 생성할 때 사인처리를 하고 사용할 때 singedCookies 속성을 사용해야한다.
가장 아래에서부터 올라가보자.
res.cookie()를 통해 쿠키를 생성할 때 객체 옵션으로 singed를 true로 설정하면 서명된 쿠키를 생성하겠다는 의미이다.
그리고 클라이언트에게서 전달받은 서명된 쿠키 정보에 접근하기 위해서는 req.signedCookies 속성을 통해 정보에 접근해야한다는 것을 잊지 말자.
만약 req.cookies로 접근한다면 undefined 혹은 빈 데이터가 값으로 반환되거나 오류가 발생하게 될 것이다.
이제 /count URL로 접속해보자.
값은 singedCookies 속성을 통해 쿠키 정보에 접근했고 값을 count 변수에 담았다.
그리고 그 값을 화면에 출력했을 때는 쿠키에 저장되는 순수한 값이 출력된다는 것을 알 수 있다.
하지만 개발자 도구를 열어 Network탭에서 서버와 클라이언트 PC간 통신한 쿠키 파일 정보를 열어보자.
Request Headers의 Cookie 정보와 Response Headers의 Set-Cookie 정보를 보면 사람이 읽을 수 없는 데이터로 변조하여 서버 PC와 클라이언트 PC만이 통신할 수 있는 암호규칙으로 정보를 통신하고 있다는 것을 알 수 있다.
따라서 해커는 화면에 출력되는 값이 쿠키에 저장되는 값인지 쉽게 판단할 수 없고 어떤 정보를 의미하는지 유추할 수가 없게 된다.
'JavaScript > Node.js' 카테고리의 다른 글
Express - MySQL Session (0) 2018.12.04 Express - Session 1 (0) 2018.12.04 Cookie (0) 2018.12.01 mysql - 글 삭제하기 (0) 2018.11.30 mysql - 글 수정하기 (0) 2018.11.29