23. Login process
거의 모든 사이트에 항상 존재하는 기능이 로그인기능이다. 서비스를 운영하기 위해서는 이를 이용하는 회원들이 있어야 하고 그 회원들이 진짜 '회원'임을 인증하기 위해서 로그인이라는 기능을 이용한다. 일반적으로 로그인 한 회원들만 사용할 수 있는 기능들이 존재하는 경우가 많으며 내가 로그인을 했는지 안했는지를 어떻게 검증하는 걸까 생각했던적이 있었는데 이번 로그인 process를 따라가며 공부하다보니 그 해답을 알 수 있었다. 오늘은 내가 공부한 Login process에 대해서 정리해 보려한다.
Login-Process
우리가 어떤 사이트에서 로그인을 한다고 생각해보자. 우선 회원가입이 되어있다는 가정하에 가입한 회원 아이디 혹은 이메일을 입력하고 비밀번호를 입력하면 아이디에 맞는 비밀번호가 맞다면 로그인이 되고 내 개인 페이지 (마이페이지)를 열람하거나 개인정보를 볼 수 있는 기능들이 열리게된다. 우리가 입력한 아이디와 비밀번호만 입력해서 두개가 맞으면 그냥 로그인 되는거 아니야? 라고 생각해왔는데 실제 로그인과정은 그렇게 단순하지 않다. 기본적으로 아이디에 해당하는 비밀번호를 그냥 단순히 입력한 정보로 DB에서 확인하게 되면 보안상의 문제가 매우 크기 때문에 이를 암호화해서 저장해야 하며 그렇게 암호화해서 저장한 비밀번호가 회원가입했던 비밀번호가 맞다해도 현재 로그인한 사람이 진짜 본인이 맞는지도 확인해보아야 한다. 이런 과정을 '인증'과 '인가' 과정을 거친다고 한다. 이름도 비슷하고 개념도 비슷한것 같은데 그 둘의 진짜 차이는 무엇일까?
인증(Authentication)과 인가(Authorization)
이름부터 햇갈리는 인증과 인가는 로그인 과정에서 어떤 역할을 할까? 간단하게 요약하자면 인증이란 로그인 할 때 입력한 정보가 실제 DB에 입력된 값이 맞는지를 확인하는 과정이고 인가란 그 인증된 정보로 로그인 한 사람이 진짜 로그인하고 있는 상태인지, 그 로그인하고 있는 상태의 회원이 서비스의 기능을 이용하려 하고 있는 것인지를 알 수 있도록 권한을 부여해주는 것을 의미한다. 인증은 이해가 쉬운데 인가라는 과정은 이름도 낮설고 설명도 말로만 풀어서 하려니 쉽지않다.
위 사이트에서 인증과 인가에 대한 좋은 예시가 있어서 가져와보았다.
여기 가족이 휴가를 떠나 집에 홀로 남겨진 반려 동물을 보살피기 위해 누군가가 잠긴 문으로 다가가고 있습니다. 이 사람에게 필요한 것은 다음과 같습니다.
- 열쇠 형태의 인증이 필요합니다. 자격 증명을 정확하게 입력하는 사용자에 한해서 액세스가 허용되는 것처럼 현관 자물쇠에 맞는 열쇠를 가진 사람에게만 접근이 허용됩니다.
- 출입 허가에 해당하는 인가 및 권한 부여가 필요합니다. 일단 집 안으로 들어가면 주방에 가서 반려 동물 사료가 보관된 찻장을 열 수 있는 권한 인증을 받게 됩니다. 하지만 침실에 들어가서 낮잠을 잘 수 있는 권한은 없습니다.
위의 예에서 인증과 권한 인증은 함께 작동합니다. 반려 동물 관리인은 집에 들어갈 수 있는 권한(인증)이 있으며, 일단 내부로 입장하면 특정 영역에 접근할 수 있습니다(권한 인증).
위의 예시를 통해 직관적으로 알 수 있듯, 인증은 최초 로그인 하는 순간에 발동되는 검증이고 인가란 인증받은 회원이 어떤 기능을 하려고 할 때 마다 증명해야하는 것인데 나는 이를 아래와 같이 나만의 예시로 바꾸어 이해했다.
이제 막 20살이 넘은 성인이 술집에 가려고할때 20살이 넘은 것은 성인이라는 인증을 사회에서 받은 것이고 그 성인이 술집에 들어가려면 민증 검사를 요구받게 되고 이를 보여줘서 본인이 성인임을 증명하는 것이 인가과정이다.
그래서 어떻게 인증하고 인가하는데?
인증이 어떻고 인가가 어떻고는 이제 알겠는데 그럼 그걸 어떻게 확인하는데?! 하고 이제 궁금해졌다. 생각보다 이 과정은 어렵지 않았는데 우선 인증하는 과정이야 다양히 사용자가 입력한 정보가 DB에 입력된 정보가 맞는지 확인하는 것이고 중요한 포인트는 이때 사용자가 로그인했다는 것을 증명하기 위해 임의로 발급된 access 토큰을 같이 넘겨주게 된다. 이후부터 이 회원은 이 넘겨받은 access token을 함께 들고다니며(위의 예시 중 민증에 해당) 기능을 수행할 때 마다 이를 같이 제시한다. 이 access token은 일반적으로 Header 에 입력하며
{
"Authorization" : "Bearer @@@@@@@@@@@@(<- access token 정보)"
}
이와 같은 형태로 입력한다. 이 때 이 토큰이 만료기간도 설정해 주어야 하는데 너무 길게 발급해주면 보안상의 문제가 발생 할 수 있으므로 access token의 경우는 30분에서 길면 1-2시간정도로 설정해서 넘겨준다. 이 방식에는 불편한점이 있는데 토큰기간이 만료될 때마다 다시발급받아야 한다는 점이다. 이를 해결하기 위해 Refresh token이라는 것도 로그인할때 함께 넘겨준다.
Refresh Token?
Refresh token 이라고해서 별건아니고 그냥 만료기간이 긴 access token 하나 더 같이 발급해주는것이다. 이렇게해서 시간이 짧은 access token이 만료되면 사용자가 refresh token이 있는지를 확인하고 이를 토대로 자동으로 access token을 재발급해주는 기능을 추가한 것 뿐이다. 이 Refresh token은 역시 보안상의 문제가 있을 수 있으므로 DB에 직접 저장하지 않고 일반적으로는 브라우저의 쿠키에 저장한다. 따라서 사용자가 해당 사이트를 로그인하고 이용중에 Refresh token의 기간동안에는 로그인한상태로 계속 유지할 수 있게 된다.(별다른 로그아웃을 하지 않는다면)
밥먹듯 하는 로그인 과정을 하나하나 따져보니 생각보다 개인보안과도 직결되는 부분이기에 되게 까다롭게 관리되어야 하고 철저한 기능이라고 생각이 들었다. 가장 기본적인 기능일 수록 가장 중요하다고 다시한번 느끼며 아직 부족한 개념과 코드를 개선해나가야겠다!