관리 메뉴

miinsun

[Spring] Spring Security - 웹의 인증 및 인가, OAuth 소셜 로그인 본문

WebApp/Spring

[Spring] Spring Security - 웹의 인증 및 인가, OAuth 소셜 로그인

miinsun 2021. 12. 20. 18:44

1. 인증 VS 인가

인증(Authentication)과 인가(Authorization)은 뜻이 비슷해 혼동 될 수 있진만 이 둘은 명확히 다른 의미를 가지고 있다.

  • 인증(Authentication) : 사용자 신원을 확인하는 행위로 웹에서는 로그인을 통해 본인 임을 확인하는 행위를 의미한다.
  • 인가(Authorization) : 사용자 권한을 확인하는 행위로 웹에서는 주로 역할에 따른 사용 권한을 의미한다.

2. 쿠키와 세션

HTTP는 상태를 저장하지 않는 'Stateless'의 특성을 갖고 있다. 그렇기때문에 클라이언트에서 요청을 서버에게 보낸 후 응답을 받을 때 같은 클라이언트의 요청인지 알 방법이 없다.

무상태(Stateless) - 클라이언트와 서버 관계에서 서버가 클라이언트의 상태를 보존하지 않음을 의미한다.

쿠키와 세션은 모두 HTTP에 상태 정보를 유지(Stateful)하기 위해 사용된다. 즉, 쿠키와 세션을 통해 서버에서는 클라이언트 별로 인증 및 인가를 할 수 있게 된다.

  1. 쿠키
    • 클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일
    • 쿠키의 구성요소
      • Name(이름) - 쿠키를 구별하는 데 사용되는 키 (중복X)
      • Value(값) - 쿠키의 값
      • Domain(도메인) - 쿠키가 저장된 도메인
      • Path(경로) - 쿠키가 사용되는 경로
      • Expires(만료기한) - 쿠키의 만료기한
  2. 세션
    • 서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용
    • 서버에서 클라이언트 별로 유일무이한 '세션 ID'를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장
    • 서버에서 생성한 '세션 ID'는 클라이언트의 쿠키값('세션 쿠키')으로 저장되어 클라이언트 식별에 사용 됨
    • 세션 동작 방식
      • 클라이언트가 서버에 요청을 보냄
      • 서버가 세션 ID를 생성하고, 응답 헤더에 전달
        • 세션 ID 형태: "SESSIONID = 12A345"
      • 클라이언트가 쿠키('세션 쿠키')를 저장
      • 클라이언트가 서버에 다시 요청을 보냄
        • 쿠키값(세션 ID)을 포함하여 요청
      • 서버가 세션ID를 확인하고, 처음의 요청과 같은 클라이언트임을 인지
  3. 쿠키와 세션 비교
  쿠키 (Cookie) 세션 (Session)
설명 클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일 서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용
저장위치 클라이언트 (웹 브라우저) 웹 서버
사용 예 ex) 사이트 팝업의 "오늘 다시보지 않기" 정보 저장 ex) 로그인 정보 저장
만료시점 쿠키 저장 시 만료일시 설정 가능 (브라우저 종료 시도 유지 가능) 다음 조건 중 하나가 만족 될 경울 만료됨. 1. 브라우져 종료 시까지 2. 클라이언트 로그아웃시까지 3. 서버에 설정한 유지기간까지 해당 클라이언트의 재요청일 없는 경우
용량 제한 브라우져 별로 다름 ex) 크롬 기준 - 하나의 도메인 당 180개, 하나의 쿠키 당 4KB 개수 제한 없음 (단, 세션 저장소 크기 이상 저장 불가능)
보안 취약 클라이언트에서 쿠키 정보를 쉽게 변경할 수 있고, 삭제 및 가로채기의 위험 비교적 안전 서버에 저장되기 때문에 상적으로 안전

3. 스프링 시큐리티 프레임워크

스프링 시큐리티 프레임워크는 스프링 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공한다.

  • 스프링 시큐리티를 이용한 로그인 처리 구현

스프링 시큐리티 사용 전
스프링 시큐리티 사용 후

  • 로그인 처리 과정
    • 인증/인가 성공 시에만, Controller에게 회원 정보 전달(UserDetails)

  • 컨트롤러에서 인가가 필요한 API에 @Secured 어노테이션과 "ROLE 이름" 추가
    • Secured("{ROLE 이름}")
    • 이제 해당 API에 접근 시, 스프링 시큐리티가 로그인 시도하는 회원이 관리자 역할을 가지고 있는지 인가한다.
    • 만약 관리자 권한을 가지고 있지 않은 회원의 요청이라면, 스프링 시큐리티 설정에 따라 접근 금지 페이지를 내릴 수 있다.
    • 서버에서는 접근 권한에 대한 응답을 "HTTP Status Code 403(Forbidden)"으로 정의해두고 사용한다.
@Secured("ROLE_ADMIN")
@GetMapping("/admin")
  • spring security 사용 방법은 다음 게시글을 참고
 

[Spring] Spring Security 로그인/로그아웃/패스워드 암호화 기능 구현

💻 실습 환경 Language: Java8 Spring Boot IDE: IntelliJ 💬 요구 사항 Spring Security를 이용해 로그인, 로그아웃, 패스워드 암호화 기능을 구현한다 📌 스프링 시큐리티 프레임워크 추가 build.gradle파일에..

miinsun.tistory.com

 

4. 소셜 로그인

모든 웹 사이트에서 회원가입 과정을 거치는 것은 사용자에게 부담을 줄 수 있다. 서버 개발, 운영자들은 회원들의 개인정보를 지켜야하는 역할이 부담이 될 수 있다. 이런 문제를 해결하기 위해서 OAuth를 사용한 소셜 로그인이 등장하게 됐다.

OAuth란?
인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다.

사용자가 애플리케이션에게 모든 권한을 넘기지 않고 사용자 대신 서비스를 이용할 수 있게 해주는 HTTP 기반 보안 프로토콜이다.

OAuth를 사용하는 제공자는 대표적으로 구글, 페이스북 등이 있고 국내에서는 네이버와 카카오가 있다.

OAuth 로그인 흐름도

Comments