[Spring] 인증, 인가, 쿠키, 세션, OAuth2

인증, 인가, 쿠키, 세션, OAuth2

스파르타 코딩 클럽의 Spring 심화반 2주 차 내용인 인증, 인가, 쿠키, 세션, OAuth2을 정리한다.

핵심 내용

  • 웹에서의 인증 & 인가, 쿠키 & 세션

  • Spring Security를 이용한 인증 및 인가

  • OAuth2를 이용한 소셜 로그인

인증 vs 인가

인증 (Authentication)

사용자의 신원을 확인하는 행위

로그인을 통해(주로 아이디와 패스워드로) 본인임을 확인하는 것

인가 (Authorization)

사용자의 권한을 확인하는 행위

역할(Admin, User …)에 따른 사용 권한 관리

쿠키와 세션

HTTP는 상태를 저장하지 않음(Stateless)
쿠키와 세션은 모두 HTTP에 상태 정보를 유지(Stateful) 하기 위해 사용됨.

쿠키

  • 클라이언트에 저장되는 작은 정보를 담은 파일
  • Application - Storage - Cookies에 도메인 별로 저장됨
  • Name(이름), Value(값), Domain(저장된 도메인), Path(사용되는 경로), Expire(만료 기한)로 구성

세션

  • 서버에 저장되며 일정 시간 동안 클라이언트의 상태를 유지하기 위해 사용
  • 세션 ID(서버에서 저장하는 클라이언트 별로 유일무이)를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장
  • 서버에서 생성한 ‘세션 ID’(응답 헤더로 전달됨)는 세션 쿠키(클라이언트가 저장)로 저장되어 클라이언트 식별에 사용됨

Spring Security를 통한 인증, 인가

스프링 시큐리티

클라이언트 - 컨트롤러

기존의 클라이언트 - 컨트롤러 사이에서 request, response를 주고받는 과정에서 인증 인가가 필요할 때, 스프링 시큐리티를 사용하여 인증과 인가를 담당해 준다.

클라이언트 - 스프링 시큐리티 - 컨트롤러

인증/인가가 성공하면 컨트롤러에게 UserDetails 객체를 보내주지만, 인증/인가가 실패하면 클라이언트에게 실패 처리를 전달한다.

로그인 처리 과정

Authentication Manager (username으로 등록된 회원 ID)-> UserDetailsService <-> DB(회원 ID로 해당 Account가 존재하는지 확인)

WebSecurityConfig에 설정한 로그인 주소로 Id와 Password를 post 요청으로 보내면 Authentication Manager가 Id를 UserDetailsService로 보내게 되고, 이를 통해 DB에서 해당 회원정보가 있는지 조회한다.

UserDetailsService -> UserDetails -> Authentication Manager

회원정보가 존재한다면, 조회된 Account 객체를 이용해 UserDetailsService에서 UserDetails 객체를 만들고, 이를 이용해 Authentication Manager에서 사용자가 입력한 Id, Password 값과 일치하는지 확인하고 인증을 시도한다.
인증이 성공적으로 이뤄진다면 요청에 대한 권한을 UserDetails가 갖고 있는지 확인하는 인가를 시도한다.

OAuth2를 이용한 소셜 로그인

OAuth2 로그인의 흐름

  • 인증 코드 요청 <-> 인증 코드 전달
  • 인증 코드로 토큰 요청 <-> 토큰 전달
  • 토큰으로 API 호출 <-> 토큰 유효성 확인 후 응답 전달

OAuth2는 위와 같은 과정으로 진행된다.

OAuth2 로그인 구현 순서

  • OAuth2를 제공해 주는 홈페이지에서 REST API 키를 받은 뒤 해당 REST API 키를 넣어 로그인 요청 URI를 통해 로그인 요청 페이지를 만든다.(프론트단에서)
  • 클라이언트가 OAuth2 로그인에 동의하면 등록해둔 콜백 URI로 인가 토큰이 전달된다.
  • 컨트롤러에서 해당 토큰을 받아 로그인 처리를 구현한다.
  • 로그인 처리는 크게 두 가지로 나눠진다.
    1. 인가 코드로 액세스 토큰을 받는 처리
    2. 액세스 토큰으로 OAuth2 사용자 정보를 받는 처리
  • 사용자 정보를 받았으면 DB에서 조회하여 해당 계정이 있으면 바로 로그인 처리(UsernamePasswordAuthenticationToken을 이용하여), 없으면 DB에 Account를 저장 후 로그인 처리를 해준다.