로그인 인증과 인가에 대해서
인증(Authentication)
유저의 identification을 확인하는 절차
프로그램 로그인은 인증된 사용자에게 지정된 권한에 맞는 메뉴를 볼 수 있게 제공하는 것으로
몇가지 이유로 인해서 필요한 필수 기능이다.
1. 보통 관리자와 일반 사용자로 계정을 구분지어 사용하기 위함이고
2. 인가 받지 않은 사람이 정보에 함부로 접근하는 것을 막기 위힘이고
3. 로그인 과정에서 최소한의 보안 절차를 통해 외부 공격을 1차적으로 차단하기 위함이다.
로그인 과정은 그러한 일련의 과정에 있어 가장 기본적이고 필수적인 조치이며
경우에 따라서는 페이지에서 기능을 실행하고자 할 때 한번 더 보안을 묻는 절차를 진행하기도 한다.
(결체 혹은 비밀번호 분실 시 휴대폰 인증 혹은 이메일 인증을 하는 것이 그 예시)
로그인 인증 절차에서 필요한 것은 크게 계정과 비밀번호로
계정이라 함은 과거에는 사용자 아이디 였고 요새는 이메일 주소와 전화번호를 이용하기도 한다.
비밀번호는 원래는 사용자가 입력한 문자 혹은 숫자를 DB에 저장하고 저장된 비밀번호와 입력 받은 번호를 비교했는데
점차 입력받은 비밀번호를 암호화 해서 DB에 저장하는 방식으로 바뀌고
HTTP Stateless 특성상 JWT 혹은 계정 토큰 등을 이용해서 로그인을 하기도 한다.
근래에만 해도 암호화에 경우는 AES 방식을 사용하였고
그러한 암호화 복호화 과정을 통해서 프로그램을 구현하기도 했었다.
최근에는 암호화 정책이 변경되면서 SHA256 방식으로 암호화 하는데
특징은 단방향 대칭키 방식으로 변경되었다는 점이다.
보통은 아이디(혹은 계정) 과 비밀번호를 동시에 사용자로부터 입력받는다.
이 둘 중 하나라도 없으면 인증을 할 수 없는데
절차를 볼 때 아이디를 먼저 찾고 해당 아이디 사용자가 가지고 있는 비밀번호를 입력 받은 비밀번호와 대조하는 과정을 거친다.
데이터베이스에 최초 계정을 생성할 때 비밀번호의 경우는 암호화를 마친 후 집어넣게 되는데 해시함수를 주로 사용한다.
해시함수란 입력받은 문자열에 특정한 수식 과정을 거치게 되면 길이가 일정한 연산 결과를 반환하게 되는데
들어온 값이 같고 해시함수의 알고리즘이 바뀌지 않는하는 몇번을 시도해도 항상 같은 값을 돌려주기 때문에
단방향 해시함수를 통해서 대조를 할 수 있다.
바꿔 말해 두 대칭키의 값이 다르다는 것은 입력받은 값이 저장된 값과 다르다는 뜻이다.
전에는 그러한 단방향 암호화를 DB에서 진행하였는데 전에 있던 업계에서 프로그램 단계에서 암호화를 하지 않았던 이유는
첫째 프론트와 백엔드로 구분지어진 개발 분야가 아니라 프로그램과 데이터베이스 만으로 이루어진 시스템 개발을 하고 있었기 때문에
암호체계가 바뀌었을 경우 프로그램 빌드 및 배포가 같이 일어나야 해서 말단 유저 단계에서 적용이 제대로 되지 못할 위험이 있고
또한 프로그램에서 암호화를 하게 될 경우 보안에서 취약할 위험성이 있기 때문이었다.
따라서 보통은 데이터베이스에서 저장 프로시저에 캡슐화해서 암호화를 거쳤기 때문에
데이터베이스의 저장프로시저를 열어보기 전까지는 보안성에 대한 보장을 할 수 있기 때문이었다.
요점은 클라이언트 프로그램 이건 웹 프로그램이건 추세가 단방향 대칭키 방식으로 암호를 복호화 하지 않고 처리하는 추세인데
해시함수 역시 몇가지 취약점은 있다.
원래 패스워드를 저장하기 위해서 설계된 것이 아니라 짧은 시간에 데이터를 검색하기 위해 설계된 것이고
공격자는 매우 빠른 속도로 임의의 문자열의 다이제스트와 해킹할 대상의 다이제스트를 비교할 수 있다
(MD5를 사용한 경우 일반적인 장비를 이용하여 1초당 56억 개의 다이제스트를 대입할 수 있다)
이런 방식으로 패스워드를 추측하면 패스워드가 충분히 길거나 복잡하지 않은 경우에는 그리 긴 시간이 걸리지 않는다
(대부분 사용자의 패스워드는 길거나 복잡하지 않을 뿐 아니라, 동일한 패스워드를 사용하는 경우도 많다).
물론 이러한 점을 보완하는 방법이 몇 가지 있는데
실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해시값을 계산하는 방법과
단방향 해쉬값을 계산 한 후 그 해쉬값을 또 또 해쉬 하고, 또 이를 반복하는 방법 등이 있다.
단방향 암호화인 비밀번호 암호화에 비해서 JWT(JSON Web Tokens)은 복호화가 가능한 기법이지만 차이가 있다.
비밀번호 암호화는 어떻게든 복호화에 성공하게 되면 실제의 값을 알 수 있지만
엑세스 토큰 방식의 JWT는 복호화를 하더레도 사용자를 알 수 없는 그저 내부에서 식별하기 위한 식별자만 있기 때문에
설령 복호화나 탈취에 성공하더라도 그 내용을 쉽게 알 수 없다.
인가과정이란 엑세스토큰 그리고 사용자 아이디와 비밀번호를 전달 받고
해당 사용자에 권한에 맟는 페이지를 제공하거나 페이지 내 기능을 수행하는데
이 사용자 권한 역시 데이터베이스에 따로 저장되어 접근 가능한 페이지를 제한하거나
혹은 권한에 맞지 않는 사용자가 해당 기능을 사용하려고 하는 경우에는 접근을 제한하기도 한다.
보통 인터넷 커뮤니티나 포털 사이트 등의 게시판을 예시로 들 수 있는데
회원가입을 하지 않고서는 댓글을 달 수도 게시물을 기재할 수도 없을 뿐더러
로그인을 하더라도 다른 사람의 게시물을 임의로 삭제할 수 없는 것 역시 해당 사용자 계정이 인가된 사용자가 아니기 때문이라 볼 수 있다.
보통 그러한 권한은 슈퍼유저 혹은 관리자에게만 부여된 것으로 관리자는 다른 사용자의 게시글을 삭제할 수도 있고 권한을 제한할 수도 있다.
(보통 인터넷 게시판에서 정해진 규정을 어겼을 경우 게시물 업로드에 대한 제한 조치를 받는 것 역시 권한 변경으로 인가가 막혔기 때문이다.)
어떻게 본다면 인증과 인가는 일반적인 클라이언트 프로그램이건 웹 사이트건 필요한 절차이고 기본적으로 알고 있어야 하는 정보임에는 틀림이 없다.
더 자세히 다루어 보고 싶지만 우선은 알고 있는 단계가 여기까지 이므로 더 알게 되면 추가적으로 다른 블로그 글을 통해서
중점적으로 다루어 보고자 한다.