인증 (Authentication) = 로그인
• 자격 증명 확인 (Auth)
• 사용자의 신원을 확인하는 과정
인가 (Authorization)
• 권한 허가 or 거부
• 어떤 개체가 어떤 리소스에 접근할 수 있는지 or 어떤 동작을 수행할 수 있는지를 검증하는 것
1. 사용자 로그인
2~5. 서버는 관련 정보를 세션 저장소에 저장하고, 사용자에게 SessionId를 발급한다. (by. 쿠키)
6. 브라우저는 인증 후 모든 요청마다 HTTP Header cookie 부분에 SessionId를 포함하여 서버에 전송한다.
7~9. 서버는 전달받은 SessionId에 해당하는 세션 정보가 세션 저장소에 존재하면 사용자가 인증되었다고 판단한다.
10. 사용자가 로그아웃 하면 해당 세션 데이터가 서버 측에서 삭제된다.
인가가 필요한 요청이 있을 때마다 쿠키에 담긴 SessionId를 통해 세션 DB를 조회하여 권한을 확인한다.
세션 방식의 장점
세션 방식의 단점
1. 사용자 로그인
2~3. 서버에서는 JWT(access token)를 발급한다.
4. 생성된 토큰을 클라이언트에게 보낸다.
클라이언트는 토큰을 받아서 local Storage에 저장하고, 사용자가 로그아웃하면 저장된 토큰을 삭제한다.
5. 인증 및 인가가 필요한 요청을 할 때마다 클라이언트는 HTTP Header의 Authorization 부분에 토큰을 담아서 보낸다.
6~7. 서버 측은 요청+토큰을 받으면 JWT의 header와 payload 값을 서버 측에 감춰둔 secret key를 통해 복호화하고, 복호화한 값을 계산한다.
계산 결과값과 signature값이 일치하고, 유효기간도 만료되지 않았다면 해당 사용자는 이후 모든 요청에 대해 로그인된 회원으로 권한을 인가한다.
JSON을 이용해서 정보를 안전하게 다루기 위한 개방형 표준 (RFC 7519) 방법
JWT에는 민감한 정보를 절대로 담지 말아야 한다!
토큰의 구조
JWT
)과 알고리즘 정보가 들어있다.사용자가 회원가입 or 로그인 했을 때 서버는 access token, refresh token 두개를 발급한다. 클라이언트는 두 token 모두 저장해 둔다.
평소에 API 통신할 때는 Access Token을 사용하고, Refresh Token은 Access Token이 만료되어 갱신될 때만 사용한다.
↳ 그럼 수명이 긴 refresh token이 탈취되면 어떡하지??
클라이언트가 Access Token를 재요청할 때마다 Refresh Token도 새로 발급받는 Refresh Token Rotation방식을 사용하자!
: Open Authorization
1️⃣ 사용자가 카카오 로그인 버튼 클릭 (카카오 로그인 요청)
2️⃣ 클라이언트가 카카오 인증 서버로 인가 코드 발급을 요청
3️⃣ 카카오 인증 서버가 사용자에게 인증/로그인 요청한다.
(로그인 안된 상태라면 카카오 로그인 창이 뜸. 이미 되어있다면 이 과정 생략)
4️⃣ 사용자 인증/로그인 성공 시, 카카오 인증 서버가 사용자에게 동의 화면을 출력한다.
5️⃣ 카카오 인증 서버가 인가 코드(Authorization Code)를 발급해 Redirect URI로 전달한다.
6️⃣ 클라이언트가 카카오 인증 서버로 인가코드를 이용하여 토큰을 요청한다.
(카카오 리소스 서버의 데이터에 접근할 수 있는 권한을 요청)
7️⃣ 카카오 인증 서버가 코드값이 정상인지 확인, 정상이면 access token을 부여한다.
👊🏻 서버는 발급받은 토큰으로 사용자 정보만 가져오는 기능만 구현하면 된다.
👊🏻 정리!!
소셜로그인 버튼 클릭 -> 카카오 로그인 -> (여기는 프론트가 알아서 해줌)
-> 로그인 성공하면 서버는 카카오 서버로부터 인가코드를 받음
8️⃣ 클라이언트는 발급받은 토큰으로 리소스 서버에 사용자 정보 가져오기를 요청
9️⃣ 카카오 인증 서버가 토큰의 유효성을 검증, 요청을 처리
🔟 클라이언트는 카카오에서 제공받은 정보를 통해 사용자가 기존에 등록되어 있는 회원인지 확인한다.
1️⃣ 우리 서비스의 서버(OAuth 용어에서는 클라이언트를 의미함)가 사용자의 id에 대한 세션을 발급
2️⃣ 우리 서비스의 클라이언트는 서비스 세션을 전달받아 로그인 완료 처리를 하고, 사용자를 로그인된 홈화면으로 이동시킨다.
oauth:
kakao:
client-id: ${KAKAO_CLIENT_ID}
client-secret: ${KAKAO_CLIENT_SECRET}
redirect-uri: ${KAKAO_REDIRECT_URI}
KAKAO_CLIENT_ID : 애플리케이션 등록 후 생성되는 App Key 정보 중 REST API 키 값KAKAO_CLIENT_SECRET : Kakao Developers > 내 애플리케이션 > 제품 설정 > 보안 메뉴에서 생성
KAKAO_REDIRECT_URI : Kakao Developers > 내 애플리케이션 > 제풀 설정 > 카카오 로그인 > Redirect URI
정보 감사합니다.