🤔 서론
대부분 블로그에 글을 작성한다고 하면 모두에게 공유하고 싶은 글을 쓰는 경우가 대다수일 것입니다.
그러나 모든 글이 모두에게 공유되는 것은 아닙니다.
특정 몇몇 사람들만 글을 볼 수 있도록 하거나, 혹은 나만을 위해 글을 작성하는 경우도 있으니 말이죠.
저도 지금까지 글을 써 오면서 저만 보고싶은 글을 쓰거나, 혹은 몇몇 팀원들에게만 글을 공유해주었던 경험이 있습니다.
새로 시작한 블로그 프로젝트에서도 여전히 이러한 요구가 존재하엮기에, 해당 기능을 만들어야 하는 상황에 직면했습니다.
이미 동일한 기능을 제공하는 티스토리를 참고하여, 글의 공개 범위를 다음과 같이 정했습니다.
- 공개 : 누구나 볼 수 있는 글의 공개 범위입니다.
- 보호 : 비밀번호를 통해 글을 보호하고, 비밀번호가 일치했을 때에만 글을 볼 수 있도록 제한하는 글의 공개 범위입니다.
- 비공개 : 글을 작성한 작성자만 볼 수 있는 글의 공개 범위입니다.
처음에는 간단히 구현할 수 있을 것이라 생각했던 기능이었지만, 구현을 하다 보니 아래와 같은 고민이 생겼습니다.
보호된 글에 대한 댓글 요청을 어떻게 처리할 것인가?
이번 글에서는 이에 대한 해결 방법을 고민하고 해결해나가는 과정을 서술해보려 합니다.
🤔 왜 문제인가
요구사항을 조금 더 명확히 하자면 다음과 같습니다.
- 보호된 글에 접근하기 위해서는 설정된 비밀번호를 입력해야 한다.
- 보호된 글에 접근 전에는 댓글을 작성할 수 없다.
- 보호된 글에 접근한 이후에는 댓글을 작성할 수 있어야 한다.
- 글의 작성자는 별도의 비밀번호 없이 보호된 글에 접근 가능하다.
정상적인 상황이라면 사용자는 보호된 글에 접근하기 위해서는 다음 화면을 통과해야 합니다.

즉 화면 단에서 글에 대한 접근을 막기에, 일반적인 상황에서는 보호된 글에 비밀번호를 통해 접근하기 전에는 댓글을 달 수 없어야 정상입니다.
그러나 댓글 작성은 API를 통해 이루어집니다.
이는 곧 API의 주소와 요청 형식을 알고 있다면 보호된 글에 접근하지 않고 Postman등을 통해 댓글을 작성할 수 있다는 것을 의미합니다.
이를 어떻게 해결할 수 있을까요?
🤔 해결 방법 고민하기
위 문제에 직면한 뒤 저는 다음 방법을 떠올렸습니다.
- 보호된 글 접근 시 입력한 비밀번호를 어딘가(로컬 스토리지나 쿠키 등)에 저장하고, 이후 요청에 이를 사용하자.
위 방법을 사용하면 보호 글에 대한 댓글 작성 처리가 가능할 것 같지만, 다음과 같은 고민이 생겼습니다.
- 비밀번호를 평문 그대로 저장해도 괜찮을까?
비밀번호를 평문 그래도 저장한다면 탈취되었을 때 바로 문제가 발생하게 됩니다.
이를 방지하기 위한 방법을 고민했을 때, 다음과 같은 해결책이 존재했습니다.
1. XSS, CSRF 취약점을 모두 없애므로써, 탈취를 방지한다.
2. 비밀번호를 암호화하여 로컬 스토리지나 쿠키 등에 저장한다.
솔직히 말해서 저는 아직 보안에 대한 지식이 깊지가 않아, 1번 방법을 채택한다면 너무 많은 비용과 시간이 들 것 같았기에 선택하기 어려웠습니다.
그래서 고려한 방법이 비밀번호를 암호화하여 저장하는 2번 방법입니다.
비대칭키 양방향 암호화 방식을 통해 비밀번호를 암호화하여 저장한다면 탈취되더라도 안전할 것이라 판단했습니다만, 문득 이렇게 암호화 로직을 도입하는 것 보다 세션을 사용하여 서버측에 정보를 저장하는 것이 훨씬 좋을 것 같다는 생각이 들었습니다.
그래서 최초 접근 성공 시 비밀번호에 대한 정보를 세션에 저장한 후, 이후 댓글 작성 요청에 사용하자는 결론에 이르렀습니다.
🤔 추가 - 해당 방식의 문제점
위 구현을 그대로 사용하는 경우 다음과 같은 몇몇 문제점들이 발생할 수 있습니다.
- '보호글 1 접근 -> 보호글 2 접근 -> 보호글 1 접근' 의 순서로 접근하는 경우 다시 비밀번호를 재입력해야하는 문제
- 보호글 1 접근 이후, 보호글 2에 요청을 보내는 경우 보호글 1과 2의 비밀번호가 같다면 요청이 성공하는 문제
- 세션 정보를 저장하고 있으므로 너무 많은 사람이 접속하는 경우 메모리 부족 문제
- 스케일아웃된 환경에서 동작이 제대로 이루어지지 않는 문제
🤔 최종적으로 선택한 방식
저는 최종적으로 포스트에 대한 비밀번호는 노출되어도 그렇게 크리티컬하지 않다고 판단하였습니다.
따라서 클라이언트측에서 비밀번호를 담은 쿠키를 생성하여 관리하도록 한 뒤, 서버에서는 세션을 사용하지 않고 쿠키에 담긴 정보를 통해 접근 권한을 확인하도록 할 것입니다. (3, 4 번 문제 해결)
2번 문제의 경우 쿠키에 포스트의 id 정보를 함께 담음으로써 해결할 수 있겠지만, 이럴 확률이 극히 낮다고 판단했으며, 만약 이러한 상황이 발생하더라고, 결국 비밀번호가 동일한 보호된 포스트가 존재한다면 이는 사용자가 충분히 뚫을 수 있다고 판단하여 현재 상황 그대로 진행하기로 했습니다.
1번 문제의 경우 보호된 포스트에 번갈아 접근하는 경우가 매우 드물 것이라 판단하여 처리하지 않기로 하였습니다.
🤔 구현
기존에는 세션에 저장하는 방식을 사용하여 구현하여 구현 코드가 있었는데, 구현 방식을 바꾸며 간단해져서 지웠습니다..!
🤔 서론
대부분 블로그에 글을 작성한다고 하면 모두에게 공유하고 싶은 글을 쓰는 경우가 대다수일 것입니다.
그러나 모든 글이 모두에게 공유되는 것은 아닙니다.
특정 몇몇 사람들만 글을 볼 수 있도록 하거나, 혹은 나만을 위해 글을 작성하는 경우도 있으니 말이죠.
저도 지금까지 글을 써 오면서 저만 보고싶은 글을 쓰거나, 혹은 몇몇 팀원들에게만 글을 공유해주었던 경험이 있습니다.
새로 시작한 블로그 프로젝트에서도 여전히 이러한 요구가 존재하엮기에, 해당 기능을 만들어야 하는 상황에 직면했습니다.
이미 동일한 기능을 제공하는 티스토리를 참고하여, 글의 공개 범위를 다음과 같이 정했습니다.
- 공개 : 누구나 볼 수 있는 글의 공개 범위입니다.
- 보호 : 비밀번호를 통해 글을 보호하고, 비밀번호가 일치했을 때에만 글을 볼 수 있도록 제한하는 글의 공개 범위입니다.
- 비공개 : 글을 작성한 작성자만 볼 수 있는 글의 공개 범위입니다.
처음에는 간단히 구현할 수 있을 것이라 생각했던 기능이었지만, 구현을 하다 보니 아래와 같은 고민이 생겼습니다.
보호된 글에 대한 댓글 요청을 어떻게 처리할 것인가?
이번 글에서는 이에 대한 해결 방법을 고민하고 해결해나가는 과정을 서술해보려 합니다.
🤔 왜 문제인가
요구사항을 조금 더 명확히 하자면 다음과 같습니다.
- 보호된 글에 접근하기 위해서는 설정된 비밀번호를 입력해야 한다.
- 보호된 글에 접근 전에는 댓글을 작성할 수 없다.
- 보호된 글에 접근한 이후에는 댓글을 작성할 수 있어야 한다.
- 글의 작성자는 별도의 비밀번호 없이 보호된 글에 접근 가능하다.
정상적인 상황이라면 사용자는 보호된 글에 접근하기 위해서는 다음 화면을 통과해야 합니다.

즉 화면 단에서 글에 대한 접근을 막기에, 일반적인 상황에서는 보호된 글에 비밀번호를 통해 접근하기 전에는 댓글을 달 수 없어야 정상입니다.
그러나 댓글 작성은 API를 통해 이루어집니다.
이는 곧 API의 주소와 요청 형식을 알고 있다면 보호된 글에 접근하지 않고 Postman등을 통해 댓글을 작성할 수 있다는 것을 의미합니다.
이를 어떻게 해결할 수 있을까요?
🤔 해결 방법 고민하기
위 문제에 직면한 뒤 저는 다음 방법을 떠올렸습니다.
- 보호된 글 접근 시 입력한 비밀번호를 어딘가(로컬 스토리지나 쿠키 등)에 저장하고, 이후 요청에 이를 사용하자.
위 방법을 사용하면 보호 글에 대한 댓글 작성 처리가 가능할 것 같지만, 다음과 같은 고민이 생겼습니다.
- 비밀번호를 평문 그대로 저장해도 괜찮을까?
비밀번호를 평문 그래도 저장한다면 탈취되었을 때 바로 문제가 발생하게 됩니다.
이를 방지하기 위한 방법을 고민했을 때, 다음과 같은 해결책이 존재했습니다.
1. XSS, CSRF 취약점을 모두 없애므로써, 탈취를 방지한다.
2. 비밀번호를 암호화하여 로컬 스토리지나 쿠키 등에 저장한다.
솔직히 말해서 저는 아직 보안에 대한 지식이 깊지가 않아, 1번 방법을 채택한다면 너무 많은 비용과 시간이 들 것 같았기에 선택하기 어려웠습니다.
그래서 고려한 방법이 비밀번호를 암호화하여 저장하는 2번 방법입니다.
비대칭키 양방향 암호화 방식을 통해 비밀번호를 암호화하여 저장한다면 탈취되더라도 안전할 것이라 판단했습니다만, 문득 이렇게 암호화 로직을 도입하는 것 보다 세션을 사용하여 서버측에 정보를 저장하는 것이 훨씬 좋을 것 같다는 생각이 들었습니다.
그래서 최초 접근 성공 시 비밀번호에 대한 정보를 세션에 저장한 후, 이후 댓글 작성 요청에 사용하자는 결론에 이르렀습니다.
🤔 추가 - 해당 방식의 문제점
위 구현을 그대로 사용하는 경우 다음과 같은 몇몇 문제점들이 발생할 수 있습니다.
- '보호글 1 접근 -> 보호글 2 접근 -> 보호글 1 접근' 의 순서로 접근하는 경우 다시 비밀번호를 재입력해야하는 문제
- 보호글 1 접근 이후, 보호글 2에 요청을 보내는 경우 보호글 1과 2의 비밀번호가 같다면 요청이 성공하는 문제
- 세션 정보를 저장하고 있으므로 너무 많은 사람이 접속하는 경우 메모리 부족 문제
- 스케일아웃된 환경에서 동작이 제대로 이루어지지 않는 문제
🤔 최종적으로 선택한 방식
저는 최종적으로 포스트에 대한 비밀번호는 노출되어도 그렇게 크리티컬하지 않다고 판단하였습니다.
따라서 클라이언트측에서 비밀번호를 담은 쿠키를 생성하여 관리하도록 한 뒤, 서버에서는 세션을 사용하지 않고 쿠키에 담긴 정보를 통해 접근 권한을 확인하도록 할 것입니다. (3, 4 번 문제 해결)
2번 문제의 경우 쿠키에 포스트의 id 정보를 함께 담음으로써 해결할 수 있겠지만, 이럴 확률이 극히 낮다고 판단했으며, 만약 이러한 상황이 발생하더라고, 결국 비밀번호가 동일한 보호된 포스트가 존재한다면 이는 사용자가 충분히 뚫을 수 있다고 판단하여 현재 상황 그대로 진행하기로 했습니다.
1번 문제의 경우 보호된 포스트에 번갈아 접근하는 경우가 매우 드물 것이라 판단하여 처리하지 않기로 하였습니다.
🤔 구현
기존에는 세션에 저장하는 방식을 사용하여 구현하여 구현 코드가 있었는데, 구현 방식을 바꾸며 간단해져서 지웠습니다..!