지금 진행하고 있는 프로젝트가 실제 서비스하게 되면 어느정도 공공기관과 연계되어 있기 때문에
보안에 대해서 상당히 신경을 많이 쓰고 있는 편이다.
가장 기본이 되는 로그인과 인증 그에 관련된 보안 이슈들을 틈틈히 찾아보고 최대한 반영하려고 애쓰고 있는 중인데
평소 업무 중에 보안에 대해 그렇게 신경을 많이 안쓰기도 해서인지 보안과 관련된 지식이 전무하였고
그런 상태에서 내 프로젝트에 적용하다 보니
마치 어떤 그림인지도 모르고 그림안의 하나하나의 요소만 따라그리고 있는듯 했다.
그래서 자세히 찾아보고 습득을 한 뒤에 사용하기로 하였고 그 일부를 조금씩 첨부해가며 적어두려 한다.
일단, 로그인이 어떻게 이루어지는지, 그리고 그렇게 처리해놓은 인증 부분들이 어떠한 방식으로 공격당하는지, 그와 관련된 보안 이슈들이 무엇들이 있는지 알아보았다.
로그인 시 인증을 처리하는 방법에는 Session ID를 활용하거나 JWT(JSON Web Token)을 활용하는 방법 등이 있는데, 나는 이중 JWT(Access-Token, Refresh-Token)을 활용하는 방법을 선택했다.
이때 토큰을 저장하는 장소에 따라 또 나뉘는데, 둘다 동일하게 브라우저에 저장하는 방식이지만 Local Storage, Cookie 크게 이렇게 나눌 수 있다.
이 부분에 대한 내용은 정확하지 않을 수 있다. 내가 이해한대로 적어놓으려 한다.
일단, Local Storage는 한번 저장하게 되면 사용자가 따로 지우거나 서비스 측에서 로그아웃이나 필요시 Local Storage를 지우는 처리를 해주지 않으면 계속해서 남아있는다. 그러나 Cookie에 저장하는 방식은 브라우저가 종료되거나 만료시간을 지정하여 처리할 경우 재발급을 하여 전달해주지 않는 이상 Token값은 사라지게 된다. 즉, 인증이 이루어지지 않게 되는 것이다.
맞는 비유인지는 모르겠지만 지갑을 어딘가에 두고 왔을 때 내가 가지러 가거나 누군가가 대신 챙겨주지 않는다면 누군가 훔쳐갈 수 있도록 계속 노출되는 것보다 일정시간이 지나거나 어떠한 이벤트로 그 지갑이 차라리 사라진다면 누군가 훔쳐갈 수 있도록 노출되는 시간이 짧아지니 보안(?)상으로는 더 안전하다 라는 식으로 이해를 했다.
여하튼 이렇게 토큰을 통하여 인증을 처리하는 방식은 Access-Token과 Refresh-Token을 로그인 시 서버에 저장하고, 일정시간이 지나게 되면 Access-Token은 만료되게 되며 이때 만료되었다는 것을 서버에 알리고 Refresh-Token을 발급하여 이를 서버에 저장하고 계속하여 인증을 유효하게 만드는 방식이라고 이해했다.
Cookie에 저장하는 방식을 사용할 시 적용할 수 있는 속성 값 중 secure는 https 접속시에만 동작하는 방식이고, httpOnly는 그 외에 경우에 Refresh-Token을 저장할 시에 공격을 방어할 목적으로 사용하는 속성 값인 것 같다.
다른 공격방식은 잘 모르겠지만 이 일을 처음 시작했을 때 XSS라는 공격방식을 배운 적 있는데 Input 태그나 URL을 통하여 Javascript를 실행하는 방식으로 정보를 탈취하거나 유해한 코드를 서비스 측에서 실행하도록 만드는 방식인데 위 속성값들로 그러한 공격을 어느정도 방어할 수 있다고 하는 것 같다.
실제 구현 코드에 대해서는 구현이 되었지만 부족하고 완전하게 내가 원하는 만큼 동작하고 있지 않는 것 같아 모든 처리가 완료 되면 그때 첨부하여 올릴 계획이다.
'React' 카테고리의 다른 글
multer를 사용하여 이미지 업로드 및 불러오는 과정 (1) | 2024.02.13 |
---|---|
실시간 알림 기능을 구현하기 위한 고려 (1) | 2024.01.31 |
Reactstrap Modal에서 autoFocus 설정 주의! (2) | 2023.11.03 |
For문을 수행하지 않는데 이유를 알 수가 없다 (0) | 2023.02.22 |
Modal이 Mouse Focus에 따라 사라지는 현상 - 해결 👌 (0) | 2023.02.12 |