웹 개발자라면 반드시 이해하고 있어야 할 기본지식중 하나인 인증& 인가 !! 인증과 인가 절차 및 인증의 필수 요소인 패스워드 암호화, 그리고 인가의 필수요소인 JWT에 대해 알아보자!!
추후에 인증은 웹사이트에서 회원가입시 입력한 패스워드를 bcrypt 로 암호화해주는 역할이 될것이고, 인가는 jwt 라이브러리를 이용하여 로그인시 jwt토큰을 발행하여 페이지마다 번번히 로그인해줄필요가 없게끔 사용자를 인증해주는 역할을 해줄 것 이다.
- 인증과 인가는 API에서 가장 자주 구현되는 기능 가운데 하나이다.
- Private한 API는 물론이고 Public한 API도 기본적인 인증과 인가를 요구한다.
웹에 접속할여는 유저가 누구인지 확인하는 절차
클라이언트가 자신이 주장하는 사용자와 같은 사용자인지 확인하는 과정
가장 대표적인 예로는 유저가 로그인을 시도 할때, 우리 DB에 있는 유저의 정보와 일치하느냐 확인하는것이 있다.
인증이 필요한 이유 : 서비스를 누가 사용하며, 추적이 가능하도록 하기 위함, 타인에게 사용자의 정보를 보호하기 위함
인증에 필요한 것은 아이디, 이메일주소, 비밀번호 등이있다.
이중에서 가장 중요한 것은 바로 비밀번호 이다.
사용자가 서버에 로그인 하면 해당 사용자가 맞는지 확인하는 과정이 바로 인가이다.
유저가 요청하는 request를 실행할 수 있는 권한이있는 유저인가를 확인하는 절차이다.
예를 들어, 해당 유저는 고객 정보를 볼 수는 있지만, 수정 할 수는 없다 등..
확인 후 유저에 대한 권한을 허락하기도 하고 권한을 부여하기도 한다.
특정 자원에 대한 접근 권한이 있는 확인하는 절차이다.
유저의 궁극적인 목표는 Resource에 접근하는 것이다.
웹 에서의 Resource에는 웹 페이지, 텍스트 , 이미지, 특정 html element 등등 의미가 다양하다.
Resource 에는 접근하기위해서는 인증과 권한(인가)이 필요하다.
비유해보자면, 예를 들어 인증(Authentication)은 주민등록증을 만17세가 되면 발급받는것이라 한다면,
인가(Authorization)는 성인이되서 발급받은 주민등록증으로 편의점에서 담배를 사거나 술집에가서 술을 마실수 있는 것
여기서 담배 , 술 은 Resource 라고 생각해볼수도있겠다.... (지극히 주관적인 생각이고 비유이다..)
웹에서 인증을 요청하는 유저는 서버에게 두가지 정보를 제시한다.
나는 '누구'인가 ▶ ID(아이디)
내가 그 유저인 증거 ▶ password(비밀번호)
요청 방식은 웹 클라이언트(브라우저)가 웹 서버에 요청하는 서비스 처리 방식을 지정하는 것으로 일반적으로 GET, POST가 많이 사용되며, 이 외에도 PUT, DELETE, HEAD 등이 있다.
웹 / 모바일에서 가장 많이 사용되는 통신 방식이다.
서버에 유저에 정보를 보내서 사용허가를 받는것
요청 방식---------------------- | 설명 |
---|---|
GET | 서버에서 자원을 가져올 때 가장 단순한 요청 방식으로 서버에 빠른속도로 요청할 때 사용한다. 주로 서버로 부터 정보를 조회하기 위해 설계된 메소드이다. URL에 데이터를 포함시켜 요청하는것으로 인해 보안에 취약하다는 단점이있다. 또 전송하는 길이에 제한이있다. 캐싱을 할 수 있다. |
POST | 서버에 자원을 새로 등록할 때데이터를 생성 / 수정하기 위해 설계된 메소드이다. URL에 데이터를 노출하지 않고 요청 데이터를 Body에 포함 전송하는 길이에 제한이 없다. 캐싱을 할 수 없다. |
PUT | 서버의 자원을 요청에 들어 있는 자원으로 치환하고자 할 때 파일을 업로드 할 때 사용한다. |
PATCH | 서버 자원의 일부만 수정하고자 할 때 사용 |
DELETE | 서버의 데이터를 삭제하는 작업을 요청할 때 사용 |
HEAD | GET방식과 같으나 요청 정보의 몸체 없이 헤더 정보만 요청하는 방식 |
OPTION | 요청 URL에 대하여 허용되는 통신 옵션을 알고자 할 때 사용하는 방식 |
TRACE | 웹 클라이언트의 요청을 그대로 반환하는 방식이다. 요청 정보가 웹 서버에 도달하기까지의 경로를 기록한다. |
Http 특징 : Reuest(요청), Response(응답) 방식
통신을 서로 주고받아도 클라이언트와 서버가 서로 연결되어 있는 것은 아니라서 각각의 통신은 독립적이라는 것
한번 요청과 응답이 완료되면 저장되지 않는 stateless 성질이 있다.
한번 요청과 응답이 끝나면 상태 정보를 유지하지 않는다. 그렇기 때문에 다른 페이지로 넘어가면 정보가 없으므로 인증 절차가 필요한 것이다.
쿠키는 클라이언트(유저의 컴퓨터)에 저장되는 텍스트 형식의 데이터
쿠키는 방문한 웹사이트에서 생성된 파일로, 인터넷 사용정보를 저장한다.
쿠키에는 사용자 인증이 유효한 시간을 명시할 수 있으며, 한 번 유효 시간이 정해지면 브라우저를 끄더라도 인증이 유지된다는 점이 특징이다.
예시) 방문 사이트에서 로그인 시, "아이디와 비밀번호를 저장하시겠습니까?" 라고 나오는 메세지
예시) 쇼핑몰사이트에서 장바구니 기능 등등...
세션은 쿠키를 기반으로 한다.
사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리한다.
세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지한다.
사용자에 대한 정보를 서버에 저장하기 때문에 쿠키보다 보안에 좋지만, 사용자가 많아질수록 서버 메모리를 많이 차지하게 됨. 그래서 동접자 수가 많은 웹 사이트인 경우 서버에 과부하를 주게 되므로 성능 저하의 요인이된다.
가장 큰 차이점은 사용자의 기록 정보가 저장되는 위치이다.
쿠키는 서버의 자원을 전혀 사용하지 않으며, 세션은 서버의 자원을 사용한다.
세션은 사용자의 수 만큼 서버 메모리를 차지하기 때문에 요즘은 이런 문제들을 보완한 토큰 기반의 인증방식을 사용하는 추세이다. jwt token
JSON 데이터 구조로 표현한 토큰이다.
서버에 정보를 보내고 그 결과를 JSON 형태 토큰으로 받는것이다.
이렇게 받은 토큰은 로그인을 하고나서 메인홈페이지로 가거나 장바구니 화면, 메뉴를 눌러서 방문 사이트내에서 다른 페이지로 넘어가도 로그인이 풀리지않게 계속해서 인가를 해주는 역할을 한다고 볼 수 있다.
아래 사진을 보면 JWT 토큰의 형태를 알 수 있다.
아래 사진은 jwt 토큰이 발급되는 전체적인 흐름이다.