Oauth란?
- 기업들의 만든 인증의 표준이다.
- 오오스가 나오기 전 인증의 춘추전국시대였는데, 이제는 오오스가 널리 쓰인다.
- 프로젝트에 오오스를 적용하면 간지가 난다. 카카오, 네이버, 구글 로그인 된다고 하면 신뢰감이 살짝 든다.
인증과 권한부여
authentication authorization
용어정의
- Resource Owner: 일반적인 사용자,우리들을 뜻한다. 자원의 소유자라고 하는 이유는, Oauth는 자원의 주인이, 서비스의 주인이 사용자라고 생각하기 떄문이다. 우리가 권한을 허용하고, 권한 결정권을 갖고 있는 사람이라 리소스 오너이다. 우리의 사용정보를 접근하려 한다.
- Client: 서비스 제공자. 개발서버. Oauth를 사용하는 주체가 서비스 제공 기업(?)이기 때문?
- Authorization Server: 깃헙, 페이스북,
- Resource Server: 깃헙, 페이스북에 데이터를 가진 서버. 우리가 루카스 서비스를 쓰면서, 우리의 리소스는 깃허브에 둔다고 생각하면 된다. 깃허브엔 서버를 두 종류 갖고 있다. 인증 서버 하나와, 리소스를 저장하는 리소스 서버 하나를 갖고 있다.
다른 데서 루카스에 있는 정보를 빌려쓰고 싶으면 루카스가 리소스 서버가 된다.
- Oauth는 항상 3자가 개입되어있다. 인증을 네이버, 카카오 등에 위임한다. 3자가 없는데 Oauth를 사용할 이유가 전혀 없고 독자 규격 사용하면 된다.
(루카스에서 깃헙을 통해 원래는 인증밖에 안했는데, 권한 부여를 통해 브랜치 생성도 가능하게 했다.)
인증방법
- authorization code
- implicit
- resource owner password-credentials
- client credentials
첫번째 authorization code가 일반적인, 정상적인 방법이다. ㅇ러가지 혼합한 인증방법 쓰지 마라.
Client: 루카스
Resource Owner: 우리. 일반 사용자
Authorization Server:
Resource Server:
- aoth공식문서
A: 루카스에서 리소스 오너(일반 사용자)에게 깃헙 쓰고 싶다고 요청. 우리의 사용 데이터에 접근하는데 허락해달란 것이다.
B: 우리(리소스 오너)는 A를 허용.
C
D: 사용자가 허락했다고, authorization에서 클라이언트로 토큰 보내준다. 사용자임을 인증할 수 있는 인증정보를 토큰에 담은 것이다. 한번만 받아서 만료기간까지 사용한다. 리프레시 토큰으로 다시 요청하면 새로운 액세스 토큰을 사용한다. 액세스 토큰은 유출되면 안된다. 안전한 서비스는 액세스 토큰 만료시간을 10분 이렇게 한다. 대신 클라이언트는 10분마다 리프레시 토큰을 이용해 액세스 토큰을 받아와야한다. 리프레시 토큰은 탈취될 확률이 적고, 만료 시간이 훨씬 길다. 리프레시 토큰을 24시간 설정하면 그때마다 사용자가 로그인 다시 해줘야한다.
E: 받은 토큰을 사용하면
F: 사용자가 허락한 리소스를 리소스 서버에서 접근할 수 있다.
싱글페이지 앱은 implicit grant가 더 맞다고 한다.
웹이 아닌 다른 기기에서 웹으로 인증할수도 있다.
Authorization code
서버가 있을 때 사용하는 방법이다. 백엔드 서버 없으면 사용할 수 없다.
user-agent는 브라우저를 뜻한다
A: 클라에서 user-agent 를 거쳐 authorizationserver로 간다. 깃헙 인증으로 권한 부여할 때 깃헙 페이지로 리다이렉트 된다. 사용자 회원가입시에 브라우저가 리다이렉트를 해줘서, authorization server로 가서, 권한 허용에 동의하게 한다.
B: 유저가 동의 버튼을 눌러준다
C: authorization코드가 브라우저로 간다. 실제로 철수가 맞는지 이 ㅋ드를 사용해 확인한다.
authorization callback url: 루카스에서 로그인버튼 누르면 login?client_id 하고 url이 바뀐다. requestUrl이 루카스를 통해 보내진다.
서버 입장에서 login?code=어쩌고를 읽을 수 있다. 저 코드를 루카스가 파싱해서 읽어내서, 이 코드를 담아서 서버에 보내주면 액세스 토큰을 보내준다. 인증 토큰으로 서비스를 이용할 수 있게 한다.