리액트 카카오 로그인2

국물빌런·2020년 8월 22일
0

역시 인증이 어렵다..

스프링 시큐리티도 더럽게 어렵더니 이것도 만만치 않네..

그래도 어찌저찌 구현했다.

일단 설명 잘 된 링크부터..

https://www.daleseo.com/react-router-authentication/

지난번에 로그인버튼 누루면 로그인화면으로 넘어가고 엑세스 토큰을 받아오는것 까지 했다.

인증이란 무엇인가?

일단 인증이란 개념에 대해 논리적으로 생각해보자.

인증이 필요한 이유는 사용자를 식별하기 위해서다.

사용자에따라 다르게 보여야하는 페이지들이 많고 사용자에게 맞는 데이터를

추출하기 위해서이다.

그럼 두가지 기능이 필요하다.

  • 사용자를 식별하는 식별자를 부여하는 기능(회원가입)
  • 다음에 다시 접속시 식별자와 세션을 연결하는 기능(로그인)

이 두가지를 합쳐서 인증이라고 부른다.

어떻게 보면 단순한 CRUD이다.

유저식별자를 생성하고, 다음 접속시 조회하는 과정일 뿐이다.

회원가입은 회원가입 폼에서 입력받아서 테이블에 insert하는 과정일 뿐이고

로그인은 폼에서 입력받은 id를 where조건으로 select하는 과정일 뿐이다.

근데 인증이 복잡하고 어려운 이유가 뭘까?어느 부분이 이해가 어려운가?

인증이 어려운 이유

내가 어렵게 느끼는 부분은 아래와 같다.

  • 보안에 대한 도메인 지식 부족
  • 권한 관리 정책
  • 강제 라우팅
  • 인증 시스템의 분리

일단 보안에 대한 도메인 지식부터 따져보자.

내가 어떤 기능을 구현한다고 치면 당장 동작하냐,안하냐가 눈에 보인다.

내가 원하는 동작이 있고, 원하지 않는 동작이 있다.

그럼 그렇게 만들면 된다.인터넷을 찾아보고, 원하는대로 동작하지 않으면 디버깅하면서

문제를 찾아 수정하면 된다.

근데 보안이란건 내가 원하는 동작이 아니다.

해야만 하는 동작이자 기능이다.

이게 무슨 차이냐면 정상동작한다,안한다의 개념이 아니라

맞다,틀리다의 개념인것이다.

이게 진짜 골때린다..ㅋㅋ

당신이 개발자라면 소스를 만들고 구현을 한 후에 이런생각을 해봤을것이다.

이렇게 하는게 맞..나..?

저 생각이 얼마나 고통스러운지 공감할거라 생각한다.

보안이 바로 저런 고민의 대표주자다.

사용자 데이터를 입력받아 회원가입기능을 구현하고

로그인 정보를 입력받아 테이블에 저장된 정보와 비교하는 기능을 구현했다고 치자.

일단 이렇게 생각할 것이다.

'비밀번호는 암호화시켜서 저장해야할 것 같은데?'

당연히 비밀번호는 암호화 시켜서 저장해야짘ㅋㅋ

그래서 인터넷에 비밀번호 암호화를 검색해서 라이브러리를 찾겠지.

뭐 비크립트 같은거 써서 암호화 했다고 치자

그럼 문제 해결인가?

그렇게 하는거 맞아?

비크립트가 뭔지는 알고 쓴거여?

비크립트 찾아볼때 솔트값, 단방향,양방향 알고리즘등등

이런거 다 고려해서 암호화한건가..?

뭐 일단 암호화된것처럼 보이긴 하는데 이러면 된거 아닌가?원본이 안보이긴 하잖아.

뭐 이런 상태일것이다.그러고 아무도 알려주지 않는다.

사실 회원가입만 그런게 아니라 대부분 개발이 이런 상황일것이다.

이게 맞나..?하는 생각만 가득한채로 그냥 넘어간다.

문제는 보안은 그냥 넘어가면 나중에 돌이킬 수가 없다.

다른 기능은 뭔가 문제가 생겨서 지금 구현한 방식이 적절하지 않다고 생각이되면

기능을 수정하면 된다.

근데 인증은 어떤가?

암호화 알고리즘을 수정할 수 있다고 생각하는가

못한다..ㅎㅎ

하더라도 이전 패스워드 호환성을 계속 유지해야하는 기술 부채가 생겨버린다.

그럼 처음부터 잘 해놔야하는데 내용이 너무 많다.

엑세스 토큰이랑 리프레쉬 토큰 차이가 무엇이며, 로컬스토리지에 이 토큰을 저장해도 되는가?

디비에 저장해야 되는건 어떤 토큰인가? 인증서버를 분리 해야하는가?

사용자가 패스워드를 폼에 입력하고 인증서버로 보낼때까지 비밀번호는 평문인데

이때 유출되면 어떡하지? 다른곳은 어떻게 하고있지?

애초에 인증서버는 어떻게 구현하지?

나도 모르겠다~~괜히 보안 컨설턴트가 있는게 아니구나..

다음으로 사람 미치게 만드는건 권한 관리이다.

권한 관리가 왜 미치냐면..이건 프로그램으로 푸는게 아니다.

권한에 대한 기획이 먼저 정립되고 나서 거거에 맞춰서 코드를 구현해야하는데..

문제는 권한에 대한 전략이 어떤지 명확히 설계후 코드를 만드는 사람이 얼마나 될까..

그럼 권한기획 먼저 해봐라. 당연히 제대로 안된다.

뭘 알아야 기획을 할 것아닌가.

그리고 강제 라우팅도 구현해야한다.

강제 라우팅이 뭐냐면 권한이 없는 페이지로 갔을때 로그인 페이지로 팅겨내는것이다.

강제 라우팅이란 표현이 맞는지도 모르겠다.

이걸 구현하려면 제일 무식한 방법으로 페이지마다 권한확인하고 권한이 없으면

팅겨내는 로직을 구현하는것이다. 근데 이렇게 구현하면 중복코드가 너무 많아지니까

보통 스프링시큐리티같은 프레임웍을 쓰곤한다.

보통 여기서 어려워진다.

보안 프레임웍은 확장성과 수많은 인증시스템과 연계하기 위해 상당히 복잡한 구조를 취하고 있다.

나는 그냥 로그인 페이지로 팅겨내고 싶을 뿐인데 이 복잡한 프레임웍을 공부해야하는 거지같은 상황..

여차저차 공부를 하다보니 권한에 따라 정책을 또 세워야한단다..

ㅋ..

인증 시스템의 분리

실무에서 대부분 시스템이 인증서버가 따로 분리되어 있는 경우가 많을것이다.

왜?

이유야 겁나 많다.

통합인증을 위해서도 있을거고, 여러 인증시스템이 있기때문일수도 있고

인증서버 이중화를 위해서일수도 있다.

뭐가 됫든 그럼 다른 서버와 통신을 하고 서로 규약에 맞추어 통신을 해야한다는건데..

역시나 복잡하다. 나는 그냥 아이디랑 패스워드 주면 맞다,틀리다만 받고 싶은데

무슨 옵션들이 그렇게 많고 추가적인 정보는 왜이렇게 많은지..

그리고 인증서버에 요청하려면 또 인증을 받아야하는 거지같은 상황..

뭐 대충 짜증나서 적어봤다.

나만 인증기능 구현이 제일 짜증나는건 아닐거다..

짜증나도 어쩌겠나. 제일 중요한 과정인건 틀림없는데

카카오 로그인은 다음글에서 적어야겠다.

profile
국물을 달라

0개의 댓글