인증! 그 어려운 너를 다룬다

jason kim·2020년 10월 30일
2

codeInCodestates

목록 보기
4/4

쿠키 인증 과정:

쿠키, 어디선가 굉장히 들어본 내용이다. 특히 구글 크롬을 사용해 본 사람이라면 들어봤을 단어이지만, 무엇인지는 자세히 모른다.
쿠키는 서버가 클라이언트 브라우저에 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, 암호화) 처리가 가능하며, 클라이언트와 서버가 모두 저장 및 관리한다. 다만 이는 영속적이지 않으며, 서버가 닫히면 세션도 모두 사라진다.

일반적인 세션이 전달되는 과정은 아래와 같다고 생각할 수 있다.

  1. 클라이언트가 가입할 때 서버가 유저의 패스워드를 DB에 해싱(sha256와 secret 등)해서 저장한다.
  2. 로그인 할 때 유저 정보를 해싱한 뒤, DB에서 비교작업을 진행한다.
  3. 만약 동일하다면, 로그인이 승인 시킨다.
  4. 서버는 해당 정보를 가지고 session_id(또 다른 secret을 통해 만든 토큰)를 만들어서 쿠키로 넘겨준다.

JWT 인증 과정:

JWT는 JSON Web Tokens의 약자로, Auto0에서 제공하는 보안 방법이다.

JWT는 아래 3가지 파트로 나뉘는데:

1) Header: 해시알고리즘 정보
2) Payload: 서버가 담고 싶어하는 정보(Public / Private한 정보)
3) Signature: Header + Payload + 나만의 Secret_Key

이처럼 최종 결과물(토큰=JWT)은 이미 기존에 검증된 내용을 암호화 하여 나온 것으로써, 마지막 Signature만 일치되는지 검증하면 모든 정보를 검증했다고도 볼 수 있기 때문이다.

일반적인 JWT가 전달되는 과정은 아래와 같다고 생각할 수 있다.

  1. 회원가입: 클라이언트가 가입할 때 서버가 유저의 패스워드를 DB에 해싱(sha256와 secret 등)해서 저장한다.
  2. 로그인: 클라이언트가 로그인 할 때 넘긴 유저 정보를 서버가 해싱한 뒤, DB에서 비교작업을 진행한다.
  3. 승인: 만약 동일하다면, 서버는 로그인이 승인 시키며,
  4. 토큰 생성: 서버는 해당 정보를 가지고 토큰(jwt: 해싱 알고리즘, 또 다른 secret)을 생성하고 토큰을 헤더에 담아서 넘겨준다.
  5. 검증: 사용자는 헤더에 항상 토큰 정보를 넘겨주기는 한다. 하지만 서버가 매번 검증이 필요하다기 보다는 필요한 부분에서 해당 헤더를 가지고 검증을 진행한다.

OAuth 2.0

이는 인증을 제 3자에게 의뢰하는 방식이다. 일반적으로 소규모 단일 기업 또는 개인 같은 경우 강력한 보안을 구축하기가 매우 어렵다. 즉 공격으로부터 매우 취약하다는 뜻이다. 이를 보완하기 위해 보다 강력한 보안 능력이 있는 제 3자에게 의뢰하여 검증을 맡기는 것이다.

0Auth2.0 서비스는 Github를 통해서 검증을 함께 진행한다.

하지만 검증만 진행할 뿐, 사용자 정보 저장 및 관리는 완전히 서버의 몫이다.

검증이 성공적으로 진행되면, Github는 서버에게 해당 사용자와 관련된 토큰을 지급한다.

0개의 댓글