miinsun
[Spring] Spring Security - 웹의 인증 및 인가, OAuth 소셜 로그인 본문
1. 인증 VS 인가
인증(Authentication)과 인가(Authorization)은 뜻이 비슷해 혼동 될 수 있진만 이 둘은 명확히 다른 의미를 가지고 있다.
- 인증(Authentication) : 사용자 신원을 확인하는 행위로 웹에서는 로그인을 통해 본인 임을 확인하는 행위를 의미한다.
- 인가(Authorization) : 사용자 권한을 확인하는 행위로 웹에서는 주로 역할에 따른 사용 권한을 의미한다.
2. 쿠키와 세션
HTTP는 상태를 저장하지 않는 'Stateless'의 특성을 갖고 있다. 그렇기때문에 클라이언트에서 요청을 서버에게 보낸 후 응답을 받을 때 같은 클라이언트의 요청인지 알 방법이 없다.
무상태(Stateless) - 클라이언트와 서버 관계에서 서버가 클라이언트의 상태를 보존하지 않음을 의미한다.
쿠키와 세션은 모두 HTTP에 상태 정보를 유지(Stateful)하기 위해 사용된다. 즉, 쿠키와 세션을 통해 서버에서는 클라이언트 별로 인증 및 인가를 할 수 있게 된다.
- 쿠키
- 클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일
- 쿠키의 구성요소
- Name(이름) - 쿠키를 구별하는 데 사용되는 키 (중복X)
- Value(값) - 쿠키의 값
- Domain(도메인) - 쿠키가 저장된 도메인
- Path(경로) - 쿠키가 사용되는 경로
- Expires(만료기한) - 쿠키의 만료기한
- 세션
- 서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용
- 서버에서 클라이언트 별로 유일무이한 '세션 ID'를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장
- 서버에서 생성한 '세션 ID'는 클라이언트의 쿠키값('세션 쿠키')으로 저장되어 클라이언트 식별에 사용 됨
- 세션 동작 방식
- 클라이언트가 서버에 요청을 보냄
- 서버가 세션 ID를 생성하고, 응답 헤더에 전달
- 세션 ID 형태: "SESSIONID = 12A345"
- 클라이언트가 쿠키('세션 쿠키')를 저장
- 클라이언트가 서버에 다시 요청을 보냄
- 쿠키값(세션 ID)을 포함하여 요청
- 서버가 세션ID를 확인하고, 처음의 요청과 같은 클라이언트임을 인지
- 쿠키와 세션 비교
쿠키 (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 사용 방법은 다음 게시글을 참고
4. 소셜 로그인
모든 웹 사이트에서 회원가입 과정을 거치는 것은 사용자에게 부담을 줄 수 있다. 서버 개발, 운영자들은 회원들의 개인정보를 지켜야하는 역할이 부담이 될 수 있다. 이런 문제를 해결하기 위해서 OAuth를 사용한 소셜 로그인이 등장하게 됐다.
OAuth란?
인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다.사용자가 애플리케이션에게 모든 권한을 넘기지 않고 사용자 대신 서비스를 이용할 수 있게 해주는 HTTP 기반 보안 프로토콜이다.
OAuth를 사용하는 제공자는 대표적으로 구글, 페이스북 등이 있고 국내에서는 네이버와 카카오가 있다.
'WebApp > Spring' 카테고리의 다른 글
[JPA] 복합키 설정 (0) | 2022.02.04 |
---|---|
[Spring] 한글 파라미터 깨짐 해결 방법 (0) | 2022.02.03 |
[Spring] Spring Boot를 이용한 단위·통합 테스트 (0) | 2022.01.13 |
[Spring] Spring Security 로그인/로그아웃/패스워드 암호화 기능 구현 (0) | 2021.12.20 |
[Spring] Spring 필수 개념 정리 (0) | 2021.12.20 |