ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 10/29 TIL | 인증(Authentication)과 인가(Authorization)
    📝 기록/매일의 기록 2022. 10. 29. 23:58

    드디어 11주차의 학습의 첫날..! 이번 주는 로그인/회원가입을 배우는 주간인데, Spring Security를 통해서 구현한다. 오늘은 로그인 파트를 공부했는데, Hash 알고리즘을 활용하여 사용자에게 필요한 암호를 암호화하고, JWT를 활용해 사용자 정보가 담긴 토큰을 발급하는 과정을 배웠다.

    그렇게 이번 주차 강의는 로그인/회원가입인 만큼, 인증(Authentication)과 인가(Authorization)라는 개념이 중요하게 다가왔는데, 솔직히 말해서 '인가'라는 단어는 이번에 처음 들었다..😅 항상 Authorization이라고 사용하였기 때문에... 옆에 붙은 영단어 Authorization을 보고 아하.. 그 뜻이구나 싶었다ㅎㅎ.. 이렇게 (내게는) 생소했던 단어인 인가와 인증에 대한 개념 정리로 오늘의 TIL을 한번 작성해보려고 한다!


    인증과 인가는 로그인 프로세스에서 서로 다른 단계에 존재한다. 우선 인증이란, 사용자의 신원을 확인하는 행위를 말한고, 인가는 사용자에게 권한을 부여하는 것을 말한다. 비유적으로 설명하자면, 우리 가족이 외국으로 휴가를 2주 동안 떠나게 되었다. 집에 홀로 남겨진 반려 동물을 하루에 한 번씩 가서 보살펴 달라고 옆집 할머니에게 부탁을 드렸고, 부탁받은 옆집 할머니가 우리 집을 방문할 때 필요한 것은 다음과 같다.

    - 열쇠 형태의 인증이 필요하다. 자격 증명을 정확하게 입력하는 사용자에 한해서 액세스가 허용되는 것처럼 현관 자물쇠에 맞는 열쇠를 가진 사람(=옆집 할머니)에게만 접근이 허용된다.
    출입 허가에 해당하는 인가 및 권한 부여가 필요하다. 일단 집 안으로 들어가면 주방에 가서 반려 동물 사료가 보관된 찻장을 열 수 있는 권한 인증을 받게 된다. 하지만 침실에 들어가서 낮잠을 잘 수 있는 권한은 없다. 

    위의 예에서 인증과 권한 인증은 함께 작동한다. 옆집 할머니는 집에 들어갈 수 있는 권한(인증)이 있으며, 일단 내부로 입장하면 특정 영역에 접근할 수 있다(인가).

    다시 웹의 관점에서 이야기해보자면, 어떤 사이트에서든 누가, 언제, 어떻게 쓰고 있는가를 파악하기 위해 인증과 인가가 구현되어야 한다. 하여 API에서 가장 자주 구현되는 기능 중 하나이며, 인증은 어떤 개체(사용자 또는 장치)의 신원을 확인하는 과정이다. 개체는 보통 어떤 인증요소를 증거로 제시하여 자신을 인증한다.

    인가는 인증과 달리 어떤 개체가 어떤 리소스에 접근할 수 있는지 또는 어떤 동작을 수행할 수 있는지를 검증하는 것, 즉 접근 권한을 얻는 일을 말한다. 일반적으로 토큰이라 부르는 가공물을 사용하여 인가를 다루는데, 유저가 로그인을 하면 앱은 유저가 무엇을 할 수 있는가에 관심을 갖게 되고 사용자 신원을 바탕으로 인가 세부 사항을 가진 토큰을 생성하게 된다. 이때 시스템은 인가 토큰을 이용해서 어떤 권한을 부여할지, 즉 리소스 접근 요청을 허용할지 거부할지를 결정한다.

    중요한 점은 인증은 인가로 이어지지만 인가는 인증으로 이어지지는 않는다는 것이다. 신원 증명이 접근 권한을 승인하기에 충분하다고 해도, 즉 무언가를 얻는데 인가를 받을 수 있다고 해도 인가가 항상 개체를 식별하는 데 사용할 수 있는 게 아니라는 것을 의미한다.

    예를 들어 지문은 우리집 문을 여는 보안키로 해당 문을 열 수 있는 인가 역할도 하고 신원 데이터도 포함하고 있다. 등록된 가족 구성원의 지문만이 문을 열 수 있기 때문이다. 하지만 열쇠는 지문과 달리 신원 세부 사항을 담고 있지는 않는다. 그래서 옆집 할머니가 들고 있든, 옆집 할아버지가 들고 있든 우리 집에 출입할 수 있는 권리만 나타낼 뿐 다른 무엇도 아니라는 것이다.