인증(authentication) : 유저가 등록된 회원인지 확인하는 절차(로그인)
인가(authorization) : 인증된 유저가 특정 리소스 접근 권한이 있는지 확인하는 절차(로그인 이후 과정)
인증, 인가의 개념을 다룰때 필요한 HTTP 프로토콜의 특징
1. 무상태(stateless)
모든 요청이 "독립적" 이며, 서버가 이 전 요청의 정보를 기억하지 않는 것
=> 클라이언트 : 각 요청마다 서버에서 요구하는 모든 상태 정보를 담아서 요청해야한다
2. 비연결
서버와 클라이언트는 기본적으로 연결되어있지 않다
(서버 입장에서는 모든 요청이 매번 새로운 요청)
쿠키, 세션 / 토큰
쿠키: "브라우저"에 저장되는 작은 데이터 조각. key-value 형태로 저장
http의 무상태성과 비연결성에도 불구하고, 쿠키를 사용하여 서버가 클라이언트의 인증 상태를 "기억하는 것 처럼" 구현 가능
(쿠키는 별도 삭제 처리나 유효기간 만료의 경우가 아니면, 서버와 통신할 때 자동으로 주고 받는다)
서버에 api 요청했을 때.
1. 헤더에 "Set-Cookie" 속성으로 정보를 담아줄 경우 브라우저에 자동 저장
(저장 된 쿠키 정보 : 개발자도구> 어플리케이션> 저장용량> 쿠키 에서 확인 가능)
2. 서버에 요청시에 브라우저에 저장된 쿠키가 자동으로 서버에 전송된다
*중요 : 쿠키-브라우저에 저장. 서버 응답시에 "Set-Cookie" 속성으로 저장. Set 된 쿠키는 서버 요청시 자동으로 보내진다
+ 브라우저에서도 쿠키 추가/수정/삭제 가능
=> 서버에서 셋팅한 것이 외부 공격이나 개발자의 실수로 침범받을 가능성 또한 존재한다
세션을 이용한 인증(로그인) 방식
(최근에는 세션 보다는 토큰을 이용한 인증 방식을 많이 사용하는것으로 보인다)
-하지만 동작 방식은 알아야 함
세션 : "서버와 사용자 간의 연결이 활성화 된 상태" 를 의미하는 개념(인증이 유지되고있는 상태)
ex. 세션 종료, 세션 연결
로그인 성공 시 > 서버: 세션 생성 및 저장(key-value) > key(session id)를 브라우저에 응답(by 쿠키)
세션 인증 과정
*꼭 기억해둬야할 것 : 서버에서 session id를 설정 후, 브라우저로 보내면 브라우저는 이를 쿠키에 저장한다.
session id 설정: 서버가, Set Cookie를 통해, 브라우저에게.
세션 인가 과정
만약 인가가 승인 처리 되지 않았다면, (2) 과정에서 실패할 것을 예상 가능하다
세션 인증 방식의 한계
1. 확장성 문제
- 세션 정보는 서버의 메모리나 저장소에 저장된다 > 서버가 많아질수록 세션 동기화 문제 발생
(여러 서버가 동일한 세션 정보를 공유해야 하므로, 이를 관리하기 위한 추가적인 복잡성이 필요)
2. 메모리 사용량 증가 (서버가 메모리를 사용해 세션을 관리할 경우)
- 세션 정보를 메모리에 저장하면, 당연히 따라오는 단점.(서버 성능 저하, 비용 증가를 초래할 수 있다)
3. 상태 유지의 복잡성
- 서버에 상태를 저장하므로, 무상태성 유지가 어렵다(RESTful 아키텍의 원칙과 맞지 않는다)
4. 보안 문제
- 세션 ID가 탈취될 경우, 이를 통해 사용자의 세션을 가로체는 "하이재킹(session hijacking)" 공격 발생 가능성
=> 이러한 세션 인증 방식의 한계를 극복하기 위해 "JWT(Json Web Token)" 개발.
JWT : 서버 확장성, 무상태성 유지, 보안성 등을 개선한 토근 기반의 인증 방식
토큰을 이용한 인증 방식
*토큰 : "클라이언트" 에서 보관하는 "암호화 혹은 인코딩 된 인증정보"
암호화는 비밀 키가 필요, 인코딩은 키 없이도 원래 형태로 복원 가능
*JWT(Json Web Token) : 토큰 기반 인증 방식에서 사용되는 특별한 토큰
jwt의 3가지 구성 요소(Header, Payload, Signature)
1. 헤더 : 토큰의 종류(typ), 어느 알고리즘으로 서명되어있는지(alg)
2. 본문(payload) : 실제 중요한 데이터. 사용자 아이디, 토큰 만료 시간 등
3. 서명(signature) : 토큰이 위조되지 않았는지 확인. (서버만 알 수 있는 비밀 키로 서명되어있음)
*눈으로 확인해보기
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
JWT의 특징
1. 국제 인터넷 표준 인증 규격 중 하나.
2. 인코딩 된 토큰을 누구나 복호화 하여 payload를 볼 수 있다 > 토큰의 용도: 인증정보 보호x "위조 방지 ㅇ"
=> payload에 민감한 정보를 담지 않도록 주의. (비밀번호 등)
3. 정보(payload)를 토큰화할 때 signature에 secret key가 필요,
secret key는 토큰이 유효한 지를 검증하는 데 사용됩니다.
'개념,기능 정리' 카테고리의 다른 글
타입스크립트 타입 (0) | 2024.09.09 |
---|---|
JavaScript event loop 에 관하여 (0) | 2024.07.26 |
Zustand (1) | 2024.06.11 |
비동기 처리-promise, async/await (0) | 2024.06.10 |
Supabase (0) | 2024.05.30 |