이번엔 스프링 시큐리티를 사용해보자 - 2. 소셜 로그인과 그냥 로그인 개발하기

min·2022년 3월 17일
0

참고

용어

client: 현재 우리가 만들고 있는 서비스/어플리케이션
resource owner: 우리 서비스에 가입하려고 하는 사용자(User)
resource server: 로그인을 하는데 필요한 정보를 가지고 있는 서버. 예를 들면 구글, 네이버, 카카오톡과 같이 API를 제공하고 Resource를 제공하는 서버.
Authorization server: 인증과 관련된 정보를 제공하는 서버. 구글, 네이버, 카카오톡의 인증 서버.

OAuth2 로그인 과정

참고 블로그에서 복사 해왔다.

  1. 소셜 로그인 요청
  2. 백엔드로 GET “/oauth2/authorization/{provider-id}?redirect_uri=http://localhost:3000/oauth/redirect”으로 OAuth 인가 요청
  3. Provider 별로 Authorization Code 인증을 할 수 있도록 리다이렉트 (Redirect: GET “https://oauth.provider.com/oauth2.0/authorize?…”)
  4. 리다이렉트 화면에서 provider 서비스에 로그인
    • resource server에 client가 로그인을 요구한다. resource owner가 로그인을 시도한다. client가 resource owner의 승일을 받아서 로그인이 가능하다.
  5. 로그인이 완료된 후, Athorization server로부터 백엔드로 Authorization 코드 응답
    • client 이제 resource server로부터 승인을 받아야함.
    • AUthorization code는 임시 번호
  6. 백엔드에서 인가 코드를 이용하여 Authorization Server에 엑세스 토큰 요청
    • Authorization 코드, client id, client sceret과 같은 정보를 이용해서 내가 그 client라는 것을 resource server에 인증받음
    • 그럼 드디어 resource server로의 접속이 가능하고 client는 Access Token을 확인의 증표로 넘겨줌
  7. 엑세스 토큰 획득
  8. 엑세스 토큰을 이용하여 Resource Server에 유저 데이터 요청
  9. 획득한 유저 데이터를 DB에 저장 후, JWT 엑세스 토큰과 리프레시 토큰을 생성
    • client가 매번 Access Token을 얻는 것은 복잡함. 일정 시간이 지나면 expire 되어버리기 때문에 귀찮음.
    • Access Toekn의 경우에는 2시간 ~ 12시간까지로 유효시간이 짧기 때문에 이 유효시간이 끝났을 때 또 로그인, 패스워드 인증을 받아야 하면 사용자 도망 갈 수도 있음. 그래서 refresh token 이용.
    • Refresh Token을 통해서 또 다시 인증을 받지 않고 Access Token을 바로 얻어 올 수 있음.
  10. 리프레시 토큰은 수정 불가능한 쿠키에 저장하고, 엑세스 토큰은 프로트엔드 리다이렉트 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을 받아서 사용하여 사용자 보안을 강화시키게 하는 것
  11. 프론트엔드에서 토큰을 저장 후, API 요청 시 헤더에 Authroization: Bearer {token}을 추가하여 요청
  12. 백엔드에서는 토큰을 확인하여 권한 확인
  13. 토큰이 만료된 경우, 쿠키에 저장된 리프레시 토큰을 이용하여 엑세스 토큰과 리프레시 토큰을 재발급

고민🤔

그러면 refresh token, access token은 소셜 로그인에서 resource server와 통신하기 위해서 필요한거고 그냥 사이트 내에서의 회원가입/로그인 같은 경우에는 jwt 토큰만 발급해서 사용하면 되는 걸까;

profile
발등에 불이 따뜻하다..

0개의 댓글