Blog

[Spring]29 인증과 인가에 대한 개념과 인증의 방식 두가지 쿠키-세션, JWT 방식 개념

Author
Summary
인증과 인가의 용어 정리와 쿠키-세션, JWT 인증 방식의 비교
Category
Study
Tags
Spring
Favorite
Memory Date
2023/09/03
Cross Reference Study
Related Media
Related Thought
Related Lessons
tag
날짜
작성자
진행상황
진행 전
태그구분
6 more properties
인증과 인가의 차이점?
인증(Authentication)
인증은 해당 유저가 실제 “그” 유저인지 인증하는 개념
스마트폰에 지문인식, 이용하는 사이트에 로그인 등과 같이, 실제 그 유저가 맞는지를 확인하는 절차
인가(Authorization)
인가는 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 개념입니다. 예를들어 관리자 페이지-관리자 권한 같은 것, 준회원, 정회원 같은 서비스적 차이가 발생 할 수도 있는 개념
“웹 애플리케이션 인증”은 어떠한 특수성이 있을까?
1.
일반적으로 서버-클라이언트 구조로 되어있고, 실제로 이 두 요소는 아주 멀리 떨어져 있다.
2.
그리고 HTTP 라는 프로토콜로 통신하는데, 그 통신은 비연결성(Connectionless) 무상태(Stateless)로 이루어집니다.
a.
온라인게임 예로 들면 서버 접속이 끊기면 게임자체를 실행 못한다.
b.
하지만 홈페이지는 인터넷선을 끊어도 일단 내가 새로고침(요청)하지 않는 이상 그대로 페이지는 보여지고 있다.
c.
그래서 웹 어플리케이션 서버는 실제로 하나의 요청에 하나의 응답을 내버리고 연결을 끊어버린다고 볼 수 있다.
3.
하지만, 인터넷 사용할때는 이전의 정보들이 잘 있는것처럼 나타난다. 연속성을 보여주기도 한다.
a.
예로 인터넷 뱅킹을 하면 내가 로그인하면 30분 요청 없으면 로그아웃 시킨다던지, 내가 로그인 한 시점을 계속해서 기록하는듯한 느낌을 받게 된다.
b.
쇼핑몰의 카테고리를 점진적으로 접근 할 때, 한 계층씩 들어가는 느낌을 받는다. 가전제품>TV>상품들 처럼
c.
이와 같은 부분들은 개발자들이 많은 노력을 기울이고 있다. 마치 연속적으로, 로그인 상태를 추적한다던지, 카테고리를 입장하는 것을 /news/Sports/9 처럼 계층적으로 URL을 설계하기도 한다.
인증의 2가지 방식 쿠키-세션과 JWT기반 인증
쿠키-세션 방식의 인증
1.
사용자가 로그인 요청
2.
서버는 DB의 유저 테이블을 뒤져서 아이디 비밀번호를 확인
3.
실제 유저테이블의 정보와 일치한다면 인증을 통과한 것으로 보고 “세션 저장소”에 해당 유저가 로그인 되었다는 정보 생성
4.
세션 저장소에서는 유저의 정보와는 관련 없는 난수 session-id를 발급합니다.
5.
서버는 클라이언트에게 로그인 요청의 응답으로 session-id를 반환
6.
클라이언트는 그 session-id를 쿠키라는 저장소에 보관하고 앞으로의 요청마다 session-id를 같이 전송 (주로 HTTP header에 담아서 보냅니다!)
7.
서버는 클라이언트의 요청에서 쿠키를 발견했다면 서버는 세션 저장소에서 쿠키를 검증합니다.
8.
만약 유저정보가 담겨있다면 이 사용자는 로그인이 되어있는 사용자겠죠?
9.
이후에는 로그인 된 유저에 따른 응답을 내어줍니다.
JWT 기반 인증
1.
사용자가 로그인 요청
2.
서버는 DB의 유저 테이블을 뒤져서 아이디 비밀번호를 확인
3.
실제 유저테이블의 정보와 일치한다면 인증을 통과한 것으로 보고 유저의 정보를 JWT로 암호화한 Access Token 발급
4.
서버는 클라이언트에게 로그인 요청의 응답으로 JWT로 암호화한 Access Token을 반환
5.
클라이언트는 그 Access Token을 저장소에 보관하고 앞으로의 요청마다 Access Token을 같이 전송
6.
서버는 클라이언트의 요청에서 Access Token을 발견했다면 서버는 Access Token을 검증합니다.
7.
이후에는 로그인 된 유저에 따른 응답을 내어줍니다.
위 처럼 두가지 인증 방식의 흐름을 살펴보았다. 비슷한듯 보이지만 쿠키-세션과 JWT의 차이점은 서버에서 발급되고 클라이언트에게 저장되고 다시 요청마다 보내어지는 것이 쿠키-세션 방식에서는 session id와 cookie로 분리되어 있으며 서버는 session 저장소가 필요하며 쿠키 검증에서 사용된다. 하지만 JWT방식은 JWT암호화된 Access Token만 이동시키는 차이가 있다. 따라서 서버의 부하 감소 등 유리한 점이 발생 할 수도 있다.
질문
1.
위 설명처럼 쿠키-세션은 서버가 세션 저장소가 있어야해서 “서버비용이 많이든다”라는 설명과 부합하는것이 맞는지? 그것이 물리적으로 별도의 DB등 세션DB같은것이 필요로 해서 용량을 더 확보해야 하기 때문인지, 아니면 저 과정에서 데이터 처리량이 늘어나는 부분이 있어서 그 부분이 부담이 되는것인지?
2.
JWT방식에서 그림이 JWT와 Access Token이 혼용되서 사용되고 있는데 설명을 작성한것처럼 발급 시 JWT로 암호화된 Access Token의 이동들만 있는것이 맞는지? 그럼
3.
JWT로 암호화하고 검증하는것은 어떠한 알고리즘으로 하는것인지 그럼 어떤것을 보고 검증하는 것인지? 그것이 라이브러리 또는 패키지가 주입된 것으로부터 처리되는 것이라면 그것에 대한 용량이 세션-쿠키 방식의 세션 저장소보다 비용적으로 확실히 저렴한 것인지?
4.
세션 저장소를 쓰는 것과 다르게 혹시나 더 간단하다면, 모두가 그 방식을 사용할텐데 왜 쿠키 세션 방식은 어떤 장점이 있기에 아직도 사용되는 것이며, 반대로 JWT의 단점은 무엇인지?