인증과 인가는 API에서 자주 구현되는 기능중 하나이다.
유저 아이디와 비밀번호를 확인하는 절차를 가르키며, 로그인 하는 과정을 생각하면 된다.
인증을 위해서는 아이디/비번을 생성할수 있는 회원가입 기능 또한 필요하다.
로그인의 과정을 살펴보자.
1. 회원가입을 통한 아이디/비밀번호 생성
2. 비밀번호 암호화 > DB저장
3. 유저 로그인 : 아이디와 비밀번호 입력
4. 비밀번호 확인 : 비밀번호를 암호화 한뒤 DB의 암호와 같은지 확인, 일치하면 로그인!
5. 로그인 성공 > access token을 클라이언트에게 전달
6. 발급받은 access token을 통해 로그인 유지 및 서비스 사용
로그인을 하기 위해 우리는 먼저 아이디/비밀번호를 DB에 저장해야 한다. 회원가입을 통해 진행하며, DB에 저장된 정보와 로그인 시 입력하는 값이 같을 경우 인증 절차가 마무리 된다. 이 과정에서 우리가 꼭 알아야 하는 것이 있다. 바로 DB에 저장되는 비밀번호는 암호화를 거친 상태라는 것과 로그인 인증을 받으면 access token을 통해 서비스를 이용하게 된다는 것이다.
국내의 경우 유저의 비밀번호는 필히 암호화를 거처 DB에 저장되도록 법으로 정해져 있다. 이 때문은 아니더라도 비밀번호는 개인의 정보와 밀접한 관련이 있기 때문에 노출되지 않도록 엄격한 주의가 필요하다. (대부분의 유저가 아이디와 비밀번호를 같게 쓰는 경우가 많아 한곳에서 노출되면 여러 곳에서 노출되는 것과 같다) 이 밖에 비밀번호 암호화가 필요한 이유에 대해 정리해보면 다음과 같다.
JSON구문으로 작성된 웹 토큰, 로그인에 성공하게 되면 access token 발급받게 된다. access token에는 몇종류가 있지만 가장 많이 사용하는 기술중 하나가 JWT이다. JWT에는 유저정보를 담은 JSON데이터를 암호화 하여 클라이언트와 서버간에 주고 받게 된다.
1. 사용자 회원가입
2. 인증서버에서 JWT생성
3. 사용자에게 JWT전달
4. 사용자는 JWT를 통해 서비스 이용
사용자가 요청(Request)을 실행할 수 있는 권한이 갖는지 확인하는 절차.
JWT를 통해 구현될수 있다? YES! access token으로 사용자정보를 얻을 수 있음으로 권한확인 가능
유저는 요청을 보낼때 encoding 된 access token을 함께 첨부하며, 서버는 access token을 decoding을 통해 데이터를 확인, 유저 정보를 얻는다. 서버에서 해당 유저 정보를 통해 권한(permission)을 확인하여 해당 요청을 처리한다.
3가지 정보를 DOT(.)으로 구분하여 갖는다. 앞 2가지 정보는 encoding 되어 있으며 마지막 시그니처는 암호화 되어 있으며 유저정보와는 상관없는 정보를 담는다(서버에서 확인하는 시크릿 키)