개념,기능 정리

인증/인가 - 쿠키,세션,토큰,JWT

rhdaud2 2024. 6. 11. 20:32

 

 

 

인증(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) : 토큰이 위조되지 않았는지 확인. (서버만 알 수 있는 비밀 키로 서명되어있음)

 

 

*눈으로 확인해보기

 

https://jwt.io/

 

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