웹과 인증

yeong·2022년 6월 15일
0

web

목록 보기
3/3

웹 개발을 하다보면 인증에 관한 이야기를 많이 들을 수 있다. 세션, 토큰 등등...
그 종류도 매우 다양하다. 그러나 사실 인증이 없어도 개발은 가능하고 모두 동작한다. 그렇다면 왜 그렇게 인증에 신경을 쓰고 보안을 위한 수 많은 기술들이 등장하는 것일까?

인증이 필요한 이유?

인증이 필요한 이유는 바로 보호해야할 정보가 있기 때문이다. 예를들어 사이트의 프로필페이지 같은 특정페이지에 인증된 사용자가 아니라면 접근이 불가능해야한다. 또한 회원만이 이용할 수 있는 기능등에도 인증이 필요하다.
그렇다면 인증은 어떻게 진행할 수 있을까, 어떠한 단계를 거치는가?

인증의 단계

일반적으로 인증은 두단계로 진행된다.

  1. 사용자 접근허가(로그인등이 이에 해당)
  2. 서버사이드 세션 , 인증토큰

간단하게 로그인 통해 받은 허가, 인가를 세션-토큰을 이용해서 유지하는 것이다.
로그인을 성공하면 해당 사용자는 허가된 사용자가 되는데 서버에 정보를 요청할때마다 로그인정보를 입력할 수 없으며, 허가되었다는것을 단순히 예-아니오로 기록할 수도 없다.
안전하게 해당 사용자가 인증된 사용자라는것을 식별하기 위해 세션-토큰을 사용하는 것이다.
그렇다면 서버사이드세션과 토큰의 차이는 무엇인가?

세션 방식

서버 사이드 세션은 전통적인 인증방식으로, 사용자 접근을 허가한 서버가 허가를 받은 클라이언트의 고유 ID를 생성하고 저장한뒤 이 정보가 클라이언트에게도 보내는 방법으로 진행된다.
서버와 클라이언트는 이 고유ID를 각각 세션과 쿠키에 모두 저장한 뒤 이 고유ID를 통해 통신을 하게 된다. 이제 클라이언트가 서버에게 보내는 모든 요청에 해당 세션이 같이 보내져서 유효하지않은 ID라면 거부처리가되고 외부에서 임의로 API를 호출하는것을 막을 수 있다. 서버에서 해당 ID를 저장하고 있기때문에 가능하다.

장점

세션방식을 사용하면 회원별로 고유ID가 부여되고 세션저장소에 회원의 정보가 저장되기때문에 빠르게 회원을 식별하고 응답할 수 있다.

단점

그러나 세션방식은 서버하이재킹 위험이 있으며(https보안 강화가능) 서버가 모든것을 관리하므로 서버에 부하가 발생할 수도 있다.
또한 때로 백엔드-프론트엔드 서버가 분리된 상태라면 사용이 불가능하다. 예를 들어 여러 사이트에서 사용하는 API라면 접속한 클라이언트의 데이터를 저장해서는 안되며 서버는 이른바 무상태여야한다.

이럴때는 인증토큰을 사용할 수 있다.

인증토큰

사용자가 로그인을 시도하면 해당정보에 대해 서버가 DB에서 유효성을 확인 후 유효하면 이메일 등 정보로 인코딩 후 인증토큰을 생성하는 방식이다.
이 토큰은 요청한 클라이언트에 보내져 저장되고 서버에는 저장되지않는다. 대신 클라이언트는 요청을 할때마다 헤더에 해당 토큰을 보내고 서버는 자신이갖고있는 코드로 해싱해서 유효한지 판단을 할 수 있다.
토큰은 서버만 아는 비밀키를 사용해 해싱되므로 클라이언트는 토큰을 디코딩할 수 없고 당연히 외부에서도 시크릿키를 모르는한 정보 탈취가 불가능하다
만약 위조되었거나 키가 다르다면 접근을 거부.
이는 서버가 클라이언트를 식별하는 보안방식이자, 프론트엔드와 백엔드를 분리하도록 허용하는 기법이기도하다
이러한 토큰은 일반적을 JSON웹토큰 = JWT 형식으로 생성된다.

장점

토큰방식은 별도의 저장소 관리가 필요없으며 stateless한 서버를 만드므로 서버 화장에도 용이하다.

단점

반면 토큰방식도 단점이 존재한다. 이미 발급된 토큰에 대해서는 돌이킬 수 없습니다. 세션-쿠키의 경우 만일 쿠키가 악의적으로 이용된다면, 해당하는 세션만 지워버리면 된다. 반면 토큰의 경우 한번 발급이 된다면 만료기간까지 사용이 가능하기 때문에 탈취의 빈도가 더 높을 수 있다.
또한 인코딩된 토큰의 길이는 매우 길기때문에 자원의 낭비가 발생할 수 있다.

ref
쉽게 알아보는 서버 인증 1편(세션/쿠키 , JWT)

Udemy React완벽가이드 with Redux...

profile
안녕하세요!

0개의 댓글