You want to take into account the \fboxsep and \fboxrule parameters. Here's a new environment fminipage that shares all syntax with minipage and does the computation by itself.
\documentclass[]{article}
\usepackage{parskip}
\usepackage{lipsum}
\ExplSyntaxOn
% a handy function
\cs_set_eq:NN \dimeval \dim_eval:n
\ExplSyntaxOff
\newsavebox{\fminipagebox}
\NewDocumentEnvironment{fminipage}{O{c}oO{#1}m}
{%
\begin{lrbox}{\fminipagebox}
\IfNoValueTF{#2}
{\begin{minipage}[#1]{\dimeval{#4-2\fboxsep-2\fboxrule}}}
{\begin{minipage}[#1][#2][#3]{\dimeval{#4-2\fboxsep-2\fboxrule}}}
}
{%
\end{minipage}
\end{lrbox}\fbox{\usebox{\fminipagebox}}%
}
\begin{document}
\lipsum[1][1-4]
\begin{fminipage}{\textwidth}
\lipsum[1][5-7]
\end{fminipage}
\begin{center}
x\begin{fminipage}[t][4cm][s]{4cm}
\lipsum[2][1]
\vfill
\lipsum[2][2]
\end{fminipage}
\end{center}
\end{document}

\linewidthalthough in this particular instance you can use\textwidthas well.\linewidthwould be appropriate in general as it may change based on whether or not the margins change (as it does inside a list). – Werner Sep 08 '21 at 15:51