참고
용어
client
: 현재 우리가 만들고 있는 서비스/어플리케이션
resource owner
: 우리 서비스에 가입하려고 하는 사용자(User)
resource server
: 로그인을 하는데 필요한 정보를 가지고 있는 서버. 예를 들면 구글, 네이버, 카카오톡과 같이 API를 제공하고 Resource를 제공하는 서버.
Authorization server
: 인증과 관련된 정보를 제공하는 서버. 구글, 네이버, 카카오톡의 인증 서버.
OAuth2 로그인 과정
참고 블로그에서 복사 해왔다.
- 소셜 로그인 요청
- 백엔드로 GET “/oauth2/authorization/{provider-id}?redirect_uri=http://localhost:3000/oauth/redirect”으로 OAuth 인가 요청
- Provider 별로 Authorization Code 인증을 할 수 있도록 리다이렉트 (Redirect: GET “https://oauth.provider.com/oauth2.0/authorize?…”)
- 리다이렉트 화면에서 provider 서비스에 로그인
- resource server에 client가 로그인을 요구한다. resource owner가 로그인을 시도한다. client가 resource owner의 승일을 받아서 로그인이 가능하다.
- 로그인이 완료된 후, Athorization server로부터 백엔드로 Authorization 코드 응답
- client 이제 resource server로부터 승인을 받아야함.
- AUthorization code는 임시 번호
- 백엔드에서 인가 코드를 이용하여 Authorization Server에 엑세스 토큰 요청
- Authorization 코드, client id, client sceret과 같은 정보를 이용해서 내가 그 client라는 것을 resource server에 인증받음
- 그럼 드디어 resource server로의 접속이 가능하고 client는 Access Token을 확인의 증표로 넘겨줌
- 엑세스 토큰 획득
- 엑세스 토큰을 이용하여 Resource Server에 유저 데이터 요청
- 획득한 유저 데이터를 DB에 저장 후, JWT 엑세스 토큰과 리프레시 토큰을 생성
- client가 매번 Access Token을 얻는 것은 복잡함. 일정 시간이 지나면 expire 되어버리기 때문에 귀찮음.
- Access Toekn의 경우에는 2시간 ~ 12시간까지로 유효시간이 짧기 때문에 이 유효시간이 끝났을 때 또 로그인, 패스워드 인증을 받아야 하면 사용자 도망 갈 수도 있음. 그래서 refresh token 이용.
- Refresh Token을 통해서 또 다시 인증을 받지 않고 Access Token을 바로 얻어 올 수 있음.
- 리프레시 토큰은 수정 불가능한 쿠키에 저장하고, 엑세스 토큰은 프로트엔드 리다이렉트 URI 에 쿼리스트링에 토큰을 담아 리다이렉트 (Redirect: GET http://localhost:3000/oauth/redirect?token={jwt-token})
- 여기서는 cookie에 저장하지만 사실은 refresh의 경우에는 만료 기간이 길기 때문에 탈취된다면 문제가 있을 수도 있음. 그래서 대부분 쉽게 접근 할 수 없는 곳에 저장함. (server side)
- refresh token 값을 DB에 저장하고 index 값(hash값)을 cookie에 저장하는 경우 해당 hash table을 통해서 구현 함
- refresh token의 목적은 access token이 다시 필요하게 될 경우 변경 된 access token을 받아서 사용하여 사용자 보안을 강화시키게 하는 것
- 프론트엔드에서 토큰을 저장 후, API 요청 시 헤더에 Authroization: Bearer {token}을 추가하여 요청
- 백엔드에서는 토큰을 확인하여 권한 확인
- 토큰이 만료된 경우, 쿠키에 저장된 리프레시 토큰을 이용하여 엑세스 토큰과 리프레시 토큰을 재발급
고민🤔
그러면 refresh token, access token은 소셜 로그인에서 resource server와 통신하기 위해서 필요한거고 그냥 사이트 내에서의 회원가입/로그인 같은 경우에는 jwt 토큰만 발급해서 사용하면 되는 걸까;