인증 (Authentication)
- 유저가 누구인지 확인하는 절차이다
- 회원가입, 로그인등 사용된다
- 인증과 인가는 API에서 가장 자주 구현되는 기능 가운데 하나이다.
- Private한 API는 물론이고 Public한 API도 기본적인 인증과 인가를 요구한다.
인가 (Authorization)
- 유저에 대한 권한을 허락하는 것
- 게시판에서 다른 사람이 쓴 글을 나는 수정할 수 없다.
인증과 인가의 방법
- 인증하기 -> Request Header
- 인증 유지하기 -> Brower
- 안전하게 인증하기 -> Server
- 효율적으로 인증하기 -> Token
- 다른 채널을 통해 인증하기 -> OAuth
http://<ID>:<Pssword>@www.myservice.com/login
1. 위와 같이 request header에 ID와 Password값을 넣어 전달한다.
2. 약속된 방법(Base64 encoding)으로 암호화 된 문자열로 서버는 받아들인다.
3. 서버는 이를 해석하고 DB에서 일치하는 User 정보를 찾는다.
4. 있다면 인증 OK
Browser(Client를 통한 인증과 인가의 방식)
- 매번 인증하는 과정을 피하기 위해 브라우저의 스토리지를 이용
- 로컬 스토리지, 세션 스토리지, 쿠키 등으로 ID, Password를 저장
- 인증된 상태를 유지
- 단점 : 사용자에게 편한만큼, 해커에게도 해킹하기 편하다.
Session(Server를 통한 인증과 인가의 방식)
- 사용자가 요청을 보낸다.
- 서버는 이를 해석해서 DB에 일치하는 유저가 있는지 확인한다.
- 서버는 인증된 사용자의 식별자와 랜덤의 문자열로 세션 ID를 만든다
- 사용자에게 세션 ID를 전달한다
- 사용자는 세션 ID를 저장해서 이용한다.
장점
- 크게 위험하지 않다.
- 세션의 만료기간을 정할 수 있어서 기간이 지나면 해커가 가져가도 위험하지 않다.
- 서버에서 탈취된 세션을 삭제하면 해당ID를 이용할 수 없다
단점
- 여러개의 서버를 두었을때 문제가 생긴다.
- client가 한 서버에 요청을 해서 session ID를 전달 받았는데, 이후 다른 서버에 요청을 하면 그 서버에는 session ID가 없기 때문에 연결이 되지 않는다.
-> 해결방안
따로 세션 DB를 두는 방식이 있다. 하지만 이 또한 client가 많아졌을 때 DB가 터질 수도 있다.
Token
client와 server한테도 맡겼으니 이번에는 요청과 응답안에 사용자의 상태를 담아보자!! -> token
JWT(Jason Web Token)
- secret key를 사용해서 JWT를 만들어낸다.
- secret key를 통해 JWT의 인증 과정을 거친다.
- JWT자체는 해독하기가 매우 쉽다. 그래서 비밀번호와 같은 민감한 정보는 담지 않는다. 그리고 secret key가 중요한 만큼 노출이 되면 안된다. 그래서 서버 내부에서 잘 관리를 해야한다.
방법
- 사용자가 요청을 보낸다.
- 서버는 이를 해석해서 DB에 일치하는 유저가 있는지 확인한다.
- 서버는 secret key를 사용해서 JWT를 만들어낸다.
- JWT를 응답 헤더에 담아 클라이언트에게 전달한다.
- 클라이언트는 이 토큰을 저장한다.
- 클라이언트는 다음부터 요청을 보낼 때 헤더에 토큰을 담아 보낸다.
- 각 서버는 본인이 가진 secret key로 이 토큰의 유효성 검사를 한다.
- 사용자 정보 확인 : 이름, 만료시기, 권한
- 단점: 유효기간이 지나면 사용자는 계속 Access Token을 요청해야 한다.
(해결 방안은 Refresh Token)