T I L & Post/CS

[23.09.27/TIL] 인증과 인가

Geon_Ho 2023. 9. 27. 18:13

개념

인증 (Authentication)

유저가 자신의 신원을 증명해 웹 애플리케이션에 로그인하고 접근 권한을 얻는 과정

간단히 말해 신원의 검증!

예시로 ID PW를 통해 로그인하는 과정

인가 (Authorization)

인증된 주체에 대한 권한을 관리하고, 어떤 자원에 접근할 수 있는지 결정하는 프로세스

간단히 말해 인증 이후의 프로세스 (자원 접근~)


동작

HTTP 통신 위에서 동작하는 상황에 대해서…

http와 서버, RESTful API는 무상태성을 기초로 함 (웹 사이트 내의 모든 요청은 stateless 한 특성을 가짐)

But 로그인 후에는 인증된 상태를 유지해야 함 : Stateful

만약 인증과 인가가 stateless 하다면 사용자는 반복된 인증과정에 지치게 될 것

해소의 방식은 어떤 방식이 있을까?

 

1. 쿠키를 활용하기

HTTP 쿠키란 서버에서 사용자 브라우저로 전송하는 작은 데이터이다.

사용자가 로그인을 하면 해당 정보를 쿠키에 저장해둔 뒤 매 요청마다 해당 정보를 포함해 보내어 인가를 진행한다

→ 즉 매번 로그인을 진행하는 것과 마찬가지로 볼 수 있습니다

보안에 취약하다

→ 사용자의 정보가 그대로 드러나있기 때문에 해커도 그냥 가져갈 수 있다

→ 쿠키에 저장한다는 것은 요청할 때마다 로그인을 하는 것과 마찬가지 = 매 요청마다 사용자 정보가 들어가…

 

2. 세션을 활용하기

쿠키를 활용할 시 보안의 문제점에서 벗어나고자 서버의 도움을 받음

→ 서버에서 유저의 세션 ID를 생성해서 브라우저로 전달 후 브라우저 쿠키에 해당 정보 저장 & 활용

세션 ID를 활용해 브라우저 ↔ 서버 비교를 통해 인가를 진행!

쿠키와 비교했을 때 얻는 점

  • 브라우저의 유저 정보가 유저의 정보를 직접적으로 나타내는 것이 아니기에 보안상 이점이 있음
  • 만료시간 이후에는 쓸모 없는 정보가 되어 버림 탈취가 되더라도 위험성 낮음

문제점

  • 서버 ID 를 관리하는 서버의 메모리의 문제
  • 서비스 규모 확장 & 서버 여러개일 경우 복잡해질 가능성이 있음 (해결로 데이터베이스 서버에 저장할 경우 속도 저하 위험성) 세션 스토리지…의 과부하 등의 문제

 

3. 토큰을 활용하기

지금까지 클라이언트, 서버에 각각 맡겨봤는데 이번엔 정보 흐름에 이것을 맡겨본다고 생각

토큰으로 JWT (JSON Web Token)이 존재

서버가 뭔가를 기억하지 않음

사용자가 로그인을 진행하면 토큰을 발급해서 유저에게 주게 된다.

서버는 비밀키만 가지고 있고 매 요청의 토큰의 암호화 해독 후 인가를 진행

 

JWT & 세션: 상황에 맞는 적절한 활용이 필요함

실제 서비스에 JWT만으로 인증, 인가를 진행하기엔 한계가 존재함

 

 

추가로 읽고 참고하고 해보면 좋을 링크들
https://dev.gmarket.com/45

 

인증/인가는 어디에 어떻게 구현해야 할까?

안녕하세요 Post-tx & Accounting팀 권우석입니다. 최근 온보딩 프로젝트를 함께했던 Shopping Service API팀의 김도훈님의 제안으로 회원가입/로그인 API를 간단하게 구현하는 토이 프로젝트를 진행하고

dev.gmarket.com

https://www.youtube.com/watch?v=y0xMXlOAfss 

https://www.youtube.com/watch?v=1QiOXWEbqYQ