-
인증, 인가spring/스프링 숙련 주차 2024. 1. 29. 20:57
인증(Authentication)
- 인증은 해당 유저가 실제 유저인지 인증하는 개념이다.
- 스마트폰의 지문인식, 이용하는 사이트에 로그인 등과 같이, 실제 그 유저가 맞는지를 확인하는 절차이다.
인가(Authorization)
- 인가는 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 개념이다.
예를들어 관리자 페이지-관리자 권한 같은 것들을 들 수 있다.
인증과 인가를 헷갈려 하는 이유는 로그인만 생각해서 이다.
우리가 자주 하는 로그인은 인증을 할 때(비밀번호 입력하고 제출 할 때)이고,
회원/비회원 여부에 따라 다른 권한을 받는 것이 인가이다.
웹 애플리케이션 인증은 어떠한 특수성이 있을까?
1. 일반적으로 서버-클라이언트 구조로 되어있고, 실제로 이 두가지 요소는 아주 멀리 떨어져 있다.
2. 그리고 Http 라는 프로토콜을 이용하여 통신하는데,
그 통신은 비연결성(Connectionless) 무상태(Stateless)로 이루어진다.
근데 우리가 인터넷을 사용할 때는 이전의 정보들이 잘 있는것처럼 느껴질 때가 많다.
실제로 그렇게 느껴지기 위해서 개발자들이 많은 노력을 기울였다.
예를들어 네이버 뉴스탭 > 스포츠탭의 특정 기사를 본다고 생각하면
/News/Sport/9
와 같이 url을 계층적으로 설계하고, 다음 요청에 대한 api url을 이전 계층에만 둔다면
연속적으로 사용하고 있다고 느낄 수 있다.
그렇다면 인증과 같이 해당 유저가 인증을 통과했다는 사실은 상태값이 아닐까?
지금부터 알아볼 것이 그것이다.
모든것을 이해하기 보단 어떻게 비연결성, 무상태 프로토콜에서 유저가 '인증되었다'라는 정보를
유지시킬 수 있었는지의 관점에서 바라보자.
일반적으로 웹 애플리케이션은 아래 두 가지 방법을 통해서 인증을 처리한다.
1. 쿠키-세션 방식의 인증
- 쿠키-세션 방식은 서버가 '특정 유저가 로그인 되었다'는 상태를 저장하는 방식이다.
인증과 관련된 아주 약간의 정보만 서버가 가지고 있게 되고 유저의 이전 상태 전부는 아니더라도
인증과 관련된 최소한의 정보는 저장해서 로그인은 유지시킨다는 개념이다.
1. 사용자가 로그인 요청을 보낸다.
2. 서버는 DB의 유저 테이블을 뒤져서 아이디 비밀번호를 대조한다.
3. 실제 유저테이블의 정보와 일치한다면 인증을 통과한 것으로 보고 "세션 저장소"에 해당 유저가
로그인 되었다는 정보를 넣는다.
4. 세션 저장소에는 유저의 정보와는 관련 없는 난수인 session-id를 발급한다.
5. 서버는 로그인 요청의 응답으로 session-id를 내어준다.
6. 클라이언트는 그 session-id를 쿠키라는 저장소에 보관하고 앞으로의 요청마다 세션아이디를 같이 보낸다.
(주로 HTTP header에 담아서 보낸다.)
7. 클라이언트의 요청에서 쿠키를 발견했다면, 서버는 세션 저장소에서 쿠키를 검증한다.
8. 만약 유저정보를 받아왔다면 이 사용자는 로그인이 되어 있는 것이다.
9. 이후에는 로그인 된 유저에 따른 응답을 내어준다.
2. JWT 기반 인증
JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 토큰을 의미한다.
JWT기반 인증은 쿠키/세션 방식과 유사하게 JWT 토큰(Access Token)을 HTTP 헤더에 실어 클라이언트를 식별한다.
1. 사용자가 로그인 요청을 보낸다.
2. 서버는 DB의 유저 테이블을 뒤져서 아이디 비밀번호를 대조한다.
3. 실제 유저테이블의 정보와 일치한다면 인증을 통과한 것으로 보고 유저의 정보를 JWT로 암호화 해서 내보낸다.
4. 서버는 로그인 요청의 응답으로 jwt 토큰을 내어준다.
5. 클라이언트는 그 토큰을 저장소에 보관하고 앞으로의 요청마다 토큰을 같이 보낸다.
6. 클라이언트는 요청에서 토큰을 발견했다면 서버는 토큰을 검증한다.
7. 이후에는 로그인 된 유저에 따른 응답을 내어준다.
쿠키-세션 방식 보다 JWT 가 효율적이면서 서버의 부담도 덜 할 수 있다.