쿠키, 어디선가 굉장히 들어본 내용이다. 특히 구글 크롬을 사용해 본 사람이라면 들어봤을 단어이지만, 무엇인지는 자세히 모른다.
쿠키는 서버가 클라이언트 브라우저에 response 방식으로 전달하는 작은(최대 4kb라...
) 데이터 조각이다.
이를 통해서 아주 작은 정보 또는 상대방을 인식하는데 사용된다.
쿠키에 대한 내용은 MDN 공식 문서에 자세히 나온다.
문제는 쿠키가 왜 필요하냐는 것이다
이는 우리가 사용하는 HTTP의 특성 때문이다. 몇가지 특성 중에서 특히 Stateless와 Connectionless
때문이다. 이로써, 클라이언트를 인식하기 위한 방안으로 서버와 클라이언트가 서로 알아볼 수 있는 작은 데이터 조각을 서로 교류한다. 그 작은 데이터 조각이 바로 쿠키이다.
쿠키를 보내고 받는 방법은 헤더를 통해서 바로 받을 수 있다.
=======================================
쿠키를 보낼 때:
response.status(200)
response.write({
'Content-Type': 'text/html',
'Set-Cookie': ['id=ledgku', 'pw=cookie']
});
=======================================
쿠키를 받을 때:
let cookies = request.getCookies();
// 또는 querystring.parse(request.headers.cookie, ': ')
// 배열형식으로 받아진다
쿠키는 서버가 클라이언트의 사용자 정보(개인 정보 등)을 저장 및 관리하는 상태에서 인증 수단인 쿠키를 클라이언트에게 맡긴 상황이다. 즉, 쿠키는 클라이언트만 가지고 있다.
다만 엄청난 단점은 이 쿠키는 전혀 보안이 되어있지 않으며, 모든 사람에게 노출될 수 있다는 것이다.
세션은 쿠키와 비슷하면서도 조금은 다르다. 바로 해싱(Hashing, 암호화) 처리가 가능하며, 클라이언트와 서버가 모두 저장 및 관리한다. 다만 이는 영속적이지 않으며, 서버가 닫히면 세션도 모두 사라진다.
일반적인 세션이 전달되는 과정은 아래와 같다고 생각할 수 있다.
- 클라이언트가 가입할 때 서버가 유저의 패스워드를 DB에 해싱(sha256와 secret 등)해서 저장한다.
- 로그인 할 때 유저 정보를 해싱한 뒤, DB에서 비교작업을 진행한다.
- 만약 동일하다면, 로그인이 승인 시킨다.
- 서버는 해당 정보를 가지고 session_id(또 다른 secret을 통해 만든 토큰)를 만들어서 쿠키로 넘겨준다.
JWT는 JSON Web Tokens의 약자로, Auto0에서 제공하는 보안 방법이다.
JWT는 아래 3가지 파트로 나뉘는데:
1) Header: 해시알고리즘 정보
2) Payload: 서버가 담고 싶어하는 정보(Public / Private한 정보)
3) Signature: Header + Payload + 나만의 Secret_Key
이처럼 최종 결과물(토큰=JWT)은 이미 기존에 검증된 내용을 암호화 하여 나온 것으로써, 마지막 Signature만 일치되는지 검증하면 모든 정보를 검증했다고도 볼 수 있기 때문이다.
일반적인 JWT가 전달되는 과정은 아래와 같다고 생각할 수 있다.
- 회원가입: 클라이언트가 가입할 때 서버가 유저의 패스워드를 DB에 해싱(sha256와 secret 등)해서 저장한다.
- 로그인: 클라이언트가 로그인 할 때 넘긴 유저 정보를 서버가 해싱한 뒤, DB에서 비교작업을 진행한다.
- 승인: 만약 동일하다면, 서버는 로그인이 승인 시키며,
- 토큰 생성: 서버는 해당 정보를 가지고 토큰(jwt: 해싱 알고리즘, 또 다른 secret)을 생성하고 토큰을 헤더에 담아서 넘겨준다.
- 검증: 사용자는 헤더에 항상 토큰 정보를 넘겨주기는 한다. 하지만 서버가 매번 검증이 필요하다기 보다는 필요한 부분에서 해당 헤더를 가지고 검증을 진행한다.
이는 인증을 제 3자에게 의뢰하는 방식이다. 일반적으로 소규모 단일 기업 또는 개인 같은 경우 강력한 보안을 구축하기가 매우 어렵다. 즉 공격으로부터 매우 취약하다는 뜻이다. 이를 보완하기 위해 보다 강력한 보안 능력이 있는 제 3자에게 의뢰하여 검증을 맡기는 것이다.
0Auth2.0 서비스는 Github를 통해서 검증을 함께 진행한다.
하지만 검증만 진행할 뿐, 사용자 정보 저장 및 관리는 완전히 서버의 몫이다.
검증이 성공적으로 진행되면, Github는 서버에게 해당 사용자와 관련된 토큰을 지급한다.