인증과 인가의 특징은 정확히 무엇이고 무엇이 다를까? 정확하게 짚고 넘어가보자.
✅ 인증
인증은 사용자의 신원을 검증하는 행위로 보안 프로세스에서 첫 번째 단계이다. 아파트로 예를 들면 주민이 아파트 공동 현관문에 출입 카드를 대는 것을 인증이라고 볼 수 있다. 사용자의 신원을 검증하는 방법은 여러가지가 있을 수 있지만 대체적으로 비밀번호를 사용한다. 사용자가 올바른 비밀번호를 입력했다면 시스템은 인증을 통해 유효하다고 판단하고 엑세스를 허용한다.
✅ 인가
인증과 조금 다르게 인가는 사용자가 어떤 리소스에 접근할 수 있는지, 또는 어떤 동작을 수행할 수 있는지 검증하는 것이다. 예를 들면 어떤 커뮤니티 홈페이지에 사용자로서 인증을 받고 서비스를 이용하고 있다고 볼 때, 인증된 사용자이기 때문에 글을 남길 수 있지만, 다른 사람의 글을 삭제하거나 수정 할 수는 없는데, 이러한 이유가 다른 사용자 글에 접근할 권한, 인가가 되어있지 않기 때문이다.
🔎 요약
요약하자면
인증은 내가 누구인지 확인하는 행위.
인가는 내가 권한이 있는지 확인하는 행위
✅ 인가의 방법
인가 절차에서 JWT 기술을 적용해서 구현할 수 있다. Access Token 을 통해 해당 사용자 정보를 얻을 수 있으므로 해당 사용자가 가지고 있는 권한도 확인할 수 있다.
1. 인증 절차를 통해 Access Token을 생성한다. 엑세스 토큰은 사용자의 정보를 담은 상태이다.
2. 사용자가 요청을 보낼 때, Access Token을 첨부하여 보낸다.
3. 서버는 해당 Access Token을 Decoded하고, 정보를 얻는다.
4. 얻은 정보를 통해 DB에서 사용자 권한을 확인한다.
5. 권한이 확인되면 해당 요청을 처리하고, 권한이 없다면 에러 코드를 출력한다.
✅ JWT 알아보기
JWT에 대해 알아보기 전에 '서버 기반 인증' 과 '토큰 기반 인증'에 대해 알아보면
🔎 서버 기반 인증 시스템(Session / Cookie)
서버 측에서 사용자들의 정보를 기억하기 위해 세션을 유지하는데, 이를 메모리, 디스크, 데이터베이스 등을 통해 관리한다. 클라이언트로부터 요청을 받으면 클라이언트의 상태 정보를 저장하여 유지해야 하므로 Stateful한 구조를 가진다.
인증 방식은?
1. 사용자가 로그인 시 올바른 사용자임을 확인하고, 고유한 세션 ID 값을 부여해 세션 저장소에 저장하고 클라이언트에게 발급해준다.
2. 클라이언트는 세션 ID를 받아서 쿠키에 저장하고, 인증이 필요한 요청마다 쿠키에 세션 ID를 담아 헤더에 보낸다.
3. 서버에서는 쿠키를 받아 세션 저장소와 비교해 올바른 요청인지 확인한다.
4. 인증이 완료되고 서버는 요청에 응답한다.
중요한 정보 자체는 서버에 있기 때문에 쿠키 자체에는 유의미한 값을 가지고 있지 않다.
해커가 훔친 쿠키를 이용해 HTTP 요청을 보내면 서버에서는 올바른 사용자 인지 알 수 없다.
서버에 세션을 저장하므로 사용자가 증가함에 따라 과부하를 줄 수 있어 확장성이 용이하지 못한다.
시스템 확장이 어렵다.
🔎 토큰 기반 인증 시스템(JWT)
위와 같은 단점을 극복하기 위해 토큰 기반 인증 시스템이 나왔다.JWT는 Json Web Token의 약자로 인증에 필요한 정보를 암호화시킨 토큰을 뜻한다. 클라이언트는 Access Token(JWT)을 HTTP 헤더에 실어서 서버로 보낸다. 인증받은 사용자에게 토큰을 발급해주고, 서버에 요청할 때 HTTP 헤더에 토큰을 함께 보내 인증받은 사용자인지 확인한다.
서버 기반 인증 시스템과 다르게 사용자의 인증 정보를 서버에 저장하지 않고 클라이언트의 요청으로만 인가를 처리하므로 Stateless한 구조를 가진다.
인증 방식은?
1. 사용자가 로그인 시 올바른 사용자임을 확인하고 클라이언트에게 Access Token(JWT)를 발급해준다.
2. 클라이언트는 전달받은 토큰을 저장해두고, 인증이 필요한 요청마다 토큰을 HTTP 헤더에 담아 보낸다.
3. 서버에서는 암호화된 토큰을 복호화 해 올바른 요청인지 확인한다.
4. 인증이 완료되고 서버는 요청에 응답한다.
JWT의 장점은 토큰 기반이기에 Access Token을 발급해준 뒤 요청이 들어오면 검증만 해주면 되기 때문에 추가 저장소가 필요 없다. 즉 Stateless하다.
📚 Reference
'Computer Science' 카테고리의 다른 글
단방향 암호화와 양방향 암호화 방식 (0) | 2024.01.20 |
---|---|
쿠키(Cookie)와 세션(Session) (0) | 2023.02.08 |
함수형 프로그래밍의 특징과 장단점 (0) | 2023.02.08 |
IPC(Inter-Process Communication)란? (2) | 2023.02.06 |
[DB] 데이터베이스 정규화란? (0) | 2023.02.02 |